-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
event-listener.ts
102 lines (79 loc) · 3.07 KB
/
event-listener.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import chalk from 'chalk';
import cli from 'cli-ux';
import filesystem from 'fs';
import path from 'path';
import prompts from 'prompts';
import ExtenderParams, { ArgType } from '../../../contracts/ExtenderParamsInterface';
import BaseGenerateCommand from '../../../util/BaseGenerateCommand';
export default class GenerateBackendEventListener extends BaseGenerateCommand {
static description = 'generate an event listener';
static flags = { ...BaseGenerateCommand.flags };
static args = [...BaseGenerateCommand.args];
async run() {
const { args, flags } = this.parse(GenerateBackendEventListener);
const extDir = await this.getFlarumExtensionRoot(args.path);
await this.confirmDir(extDir);
const data = await this.prompt(extDir);
const subPath = 'src/Listener';
data.namespace = [data.packageNamespace.replace("\\", ""), this.subPathToPhpNamespace(subPath)].join("\\");
data.fullyQualifiedClassName = `\\${data.namespace}\\${data.className}`;
await this.stub(extDir, subPath, data);
await this.extender(extDir, subPath, data);
await this.fsCommit(extDir);
this.log(`New event listener added at ${path.resolve(extDir, subPath, `${data.className}.php`)}`);
this.log('Please make sure to check my work, adjust formatting, and test before commiting!!!');
}
protected async prompt(extDir: string) {
const response = await prompts([
{
name: 'eventClass',
type: 'text',
message: `Event Class (${chalk.dim("\\Vendor\\Path\\Event")})`,
validate: this.validateClassNameFullyQualified
},
{
name: 'className',
type: 'text',
message: `Listener class name`,
validate: this.validateClassName
},
], this.promptsOptions);
return Object.assign(this.simulateInitPromptData(extDir), response);
}
protected async stub(extDir: string, subPath: string, data: any) {
cli.action.start('Generating listener stub...');
const stubDir = this.getCliDir('stubs/backend');
data.eventClassFullyQualified = data.eventClass.replace("\\", "");
data.eventClassShort = data.eventClass.split('\\').slice(-1);
this.fs.copyTpl(path.resolve(stubDir, 'event-listener.php'), path.resolve(extDir, subPath, `${data.className}.php`), data);
cli.action.stop();
}
protected async extender(extDir: string, subPath: string, data: any) {
cli.action.start('Updating extend.php...');
const params: ExtenderParams = {
extender: {
className: '\\Flarum\\Extend\\Event'
},
methodCalls: [
{
methodName: 'listen',
args: [
{
type: ArgType.CLASS_CONST,
value: data.eventClass,
auxiliaryValue: 'class'
},
{
type: ArgType.CLASS_CONST,
value: data.fullyQualifiedClassName,
auxiliaryValue: 'class'
}
]
}
]
}
const newExtendPhp = await this.addExtender(extDir, params);
this.fs.write(path.resolve(extDir, 'extend.php'), newExtendPhp);
cli.action.stop();
}
}