@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.
- package/build/__tests__/modules/CliCommandRunner.test.d.ts +23 -7
- package/build/__tests__/modules/CliCommandRunner.test.js +124 -28
- package/build/__tests__/modules/CliCommandRunner.test.js.map +1 -1
- package/build/modules/CliCommandRunner.d.ts +19 -5
- package/build/modules/CliCommandRunner.js +82 -18
- package/build/modules/CliCommandRunner.js.map +1 -1
- package/build/testDoubles/prompts/fakePrompts.d.ts +1 -1
- package/build/testDoubles/prompts/fakePrompts.js +2 -2
- package/build/testDoubles/prompts/fakePrompts.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/modules/CliCommandRunner.test.ts +194 -47
- package/src/modules/CliCommandRunner.ts +105 -25
- package/src/testDoubles/prompts/fakePrompts.ts +1 -1
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
import AbstractSpruceTest from '@sprucelabs/test-utils';
|
|
2
2
|
export default class CliCommandRunnerTest extends AbstractSpruceTest {
|
|
3
|
-
private static
|
|
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
|
|
8
|
-
protected static
|
|
9
|
-
protected static
|
|
10
|
-
protected static
|
|
11
|
-
|
|
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
|
-
|
|
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
|
|
66
|
-
await this.
|
|
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
|
|
81
|
-
await this.
|
|
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
|
|
90
|
-
await this.
|
|
91
|
-
test_utils_1.assert.isEqual(meta_node_1.FakeAutomodule.numCallsToRun, 1, 'Did not call run on
|
|
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
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
|
102
|
-
|
|
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
|
-
|
|
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, "
|
|
208
|
+
], CliCommandRunnerTest, "throwsIfCommandIsNotSupported", null);
|
|
128
209
|
__decorate([
|
|
129
210
|
(0, test_utils_1.test)()
|
|
130
|
-
], CliCommandRunnerTest, "
|
|
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, "
|
|
229
|
+
], CliCommandRunnerTest, "createPackagePromptsUserForInput", null);
|
|
134
230
|
__decorate([
|
|
135
231
|
(0, test_utils_1.test)()
|
|
136
|
-
], CliCommandRunnerTest, "
|
|
232
|
+
], CliCommandRunnerTest, "createPackageDoesNotContinueIfPromptsIsInterrupted", null);
|
|
137
233
|
__decorate([
|
|
138
234
|
(0, test_utils_1.test)()
|
|
139
|
-
], CliCommandRunnerTest, "
|
|
235
|
+
], CliCommandRunnerTest, "createPackageCreatesNpmAutopackage", null);
|
|
140
236
|
__decorate([
|
|
141
237
|
(0, test_utils_1.test)()
|
|
142
|
-
], CliCommandRunnerTest, "
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAI+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"CliCommandRunner.test.js","sourceRoot":"","sources":["../../../src/__tests__/modules/CliCommandRunner.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
7
|
-
private
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
50
|
-
return
|
|
74
|
+
get userInputExistsForCreateModule() {
|
|
75
|
+
return this.interfaceName && this.implName;
|
|
51
76
|
}
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
56
|
-
|
|
57
|
-
|
|
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.
|
|
64
|
-
implName: this.
|
|
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,
|
|
1
|
+
{"version":3,"file":"CliCommandRunner.js","sourceRoot":"","sources":["../../src/modules/CliCommandRunner.ts"],"names":[],"mappings":";;;;;AAAA,4CAAmB;AACnB,gDAAuB;AACvB,oDAAqE;AACrE,sDAA6B;AAE7B,MAAqB,gBAAgB;IAmBjC,YAAsB,IAAc;QARnB,wBAAmB,GAAG,eAAe,CAAA;QACrC,yBAAoB,GAAG,gBAAgB,CAAA;QAEvC,sBAAiB,GAAG;YACjC,IAAI,CAAC,mBAAmB;YACxB,IAAI,CAAC,oBAAoB;SAC5B,CAAA;QAkEgB,yBAAoB,GACjC,6DAA6D,CAAA;QAEhD,oBAAe,GAC5B,4EAA4E,CAAA;QAmC/D,uBAAkB,GAC/B,4DAA4D,CAAA;QAE/C,8BAAyB,GACtC,oEAAoE,CAAA;QA1GpE,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;QACnC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IAC3B,CAAC;IAEO,4BAA4B;QAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,qBAAqB,CAAC,CAAA;QACtE,CAAC;IACL,CAAC;IAED,IAAY,kBAAkB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,CAAC;IAED,IAAY,OAAO;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC;IAEO,KAAK,CAAC,UAAU;QACpB,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAEpE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACvC,OAAM;QACV,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACxC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC7B,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,8BAA8B;QACtC,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAA;IAC9C,CAAC;IAEO,KAAK,CAAC,aAAa;QACvB,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAEtE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAE9B,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC;YACxC,OAAM;QACV,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACzC,MAAM,WAAW,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAC9B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACtB;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,CAAC,CAAA;IACN,CAAC;IAQD,IAAY,+BAA+B;QACvC,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAA;IAC/C,CAAC;IAEO,aAAa,CAAC,SAAiB;QACnC,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;IAED,IAAY,OAAO;QACf,OAAO,gBAAgB,CAAC,OAAO,CAAA;IACnC,CAAC;IAEO,cAAc;QAClB,OAAO,0BAAc,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,uBAAuB;YACpC,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAC,CAAA;IACN,CAAC;IAEO,cAAc;QAClB,OAAO,0BAAc,CAAC,MAAM,CAAC;YACzB,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,CAAC,CAAA;IACN,CAAC;;AA/Ja,wBAAO,GAAG,iBAAO,AAAV,CAAU;kBAFd,gBAAgB"}
|
|
@@ -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
|
|
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.
|
|
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
|
|
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,
|
|
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
|
+
"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
|
|
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 {
|
|
7
|
-
|
|
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
|
-
|
|
20
|
+
setFakeResponses,
|
|
13
21
|
} from '../../testDoubles/prompts/fakePrompts'
|
|
14
22
|
|
|
15
23
|
export default class CliCommandRunnerTest extends AbstractSpruceTest {
|
|
16
|
-
private static
|
|
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
|
-
|
|
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
|
|
51
|
-
await this.
|
|
54
|
+
protected static async createModuleCreatesInstance() {
|
|
55
|
+
const instance = await this.runCreateModule()
|
|
52
56
|
|
|
53
|
-
assert.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
69
|
-
await this.
|
|
64
|
+
protected static async createModulePromptsUserForInput() {
|
|
65
|
+
await this.runCreateModule()
|
|
70
66
|
|
|
71
|
-
assert.isEqualDeep(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
81
|
-
await this.
|
|
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
|
|
122
|
+
'Did not call run on NodeAutomodule!'
|
|
87
123
|
)
|
|
88
124
|
}
|
|
89
125
|
|
|
90
126
|
@test()
|
|
91
|
-
protected static async
|
|
92
|
-
|
|
93
|
-
interfaceName: '',
|
|
94
|
-
implName: '',
|
|
95
|
-
})
|
|
127
|
+
protected static async createPackageCreatesInstance() {
|
|
128
|
+
const instance = await this.runCreatePackage()
|
|
96
129
|
|
|
97
|
-
|
|
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
|
-
|
|
166
|
+
FakeAutopackage.numCallsToRun,
|
|
101
167
|
0,
|
|
102
|
-
'Should not have called run on
|
|
168
|
+
'Should not have called run on Autopackage!'
|
|
103
169
|
)
|
|
104
170
|
}
|
|
105
171
|
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|
239
|
+
CliCommandRunner.prompts = fakePrompts as unknown as typeof prompts
|
|
117
240
|
resetCallsToFakePrompts()
|
|
241
|
+
}
|
|
118
242
|
|
|
119
|
-
|
|
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
|
|
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
|
|
11
|
-
private
|
|
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.
|
|
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
|
|
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
|
|
68
|
-
return
|
|
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
|
|
72
|
-
return
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
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.
|
|
85
|
-
implName: this.
|
|
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
|
|
9
|
+
export function setFakeResponses(responses: Record<string, string>) {
|
|
10
10
|
fakeResponses = responses
|
|
11
11
|
}
|
|
12
12
|
|