generator-discord 1.3.0 → 1.3.2

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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAYzC,KAAK,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/D,UAAU,OAAO;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACtB;AAGD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACtD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI/D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA6ChC,IAAI,IAAI,IAAI;IAYZ,OAAO,IAAI,IAAI;IAuBT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;CAWjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;AAazC,KAAK,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/D,UAAU,OAAO;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACtB;AA6BD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAS;IACtD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI/D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDhC,IAAI,IAAI,IAAI;IAYZ,OAAO,IAAI,IAAI;IAsBT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;CAWjE"}
package/app/index.js CHANGED
@@ -1,11 +1,31 @@
1
1
  import Generator from 'yeoman-generator';
2
2
  import path from 'path';
3
+ import url from 'url';
3
4
  const TEMPLATE_DIR = '../templates/';
4
5
  const USER_DIR = '.';
5
6
  const BOT_NAME = /<%= bot-name %>/g;
6
7
  const BOT_TOKEN = /<%= bot-token %>/g;
7
8
  // needed for rust
8
9
  const BOT_NAME_RUST = /bot_name/g;
10
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
11
+ const botNameValidation = {
12
+ typescript: {
13
+ regex: new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$'),
14
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
15
+ },
16
+ javascript: {
17
+ regex: new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$'),
18
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
19
+ },
20
+ python: {
21
+ regex: new RegExp('^[a-zA-Z0-9_]+$'),
22
+ errorMessage: 'Invalid bot name. Please use only letters, numbers, and underscores. Must start with a letter.'
23
+ },
24
+ rust: {
25
+ regex: new RegExp('/^[a-z][a-z0-9_-]*$/'),
26
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, underscores, and hyphens. Must start with a letter.'
27
+ }
28
+ };
9
29
  export default class DiscordGenerator extends Generator {
10
30
  answers = {};
11
31
  constructor(args, options) {
@@ -13,38 +33,36 @@ export default class DiscordGenerator extends Generator {
13
33
  }
14
34
  async prompting() {
15
35
  this.logo();
36
+ const askBotType = await this.prompt({
37
+ type: 'list',
38
+ name: 'botType',
39
+ message: 'The type of Discord Bot you want to create.',
40
+ choices: [
41
+ {
42
+ name: 'New Discord Bot (TypeScript)',
43
+ value: 'typescript'
44
+ },
45
+ {
46
+ name: 'New Discord Bot (JavaScript)',
47
+ value: 'javascript'
48
+ },
49
+ {
50
+ name: 'New Discord Bot (Python)',
51
+ value: 'python'
52
+ },
53
+ {
54
+ name: 'New Discord Bot (Rust)',
55
+ value: 'rust'
56
+ },
57
+ ]
58
+ });
16
59
  this.answers = await this.prompt([
17
60
  {
18
61
  type: 'input',
19
62
  name: 'botName',
20
63
  message: 'Your Discord Bot name:',
21
64
  default: 'my-bot',
22
- validate: (input) => new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$').test(input)
23
- ? true
24
- : 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
25
- },
26
- {
27
- type: 'list',
28
- name: 'botType',
29
- message: 'The type of Discord Bot you want to create.',
30
- choices: [
31
- {
32
- name: 'New Discord Bot (TypeScript)',
33
- value: 'typescript'
34
- },
35
- {
36
- name: 'New Discord Bot (JavaScript)',
37
- value: 'javascript'
38
- },
39
- {
40
- name: 'New Discord Bot (Python)',
41
- value: 'python'
42
- },
43
- {
44
- name: 'New Discord Bot (Rust)',
45
- value: 'rust'
46
- },
47
- ]
65
+ validate: (input) => botNameValidation[askBotType.botType].regex.test(input) ? true : botNameValidation[askBotType.botType].errorMessage
48
66
  },
49
67
  {
50
68
  type: 'input',
@@ -53,6 +71,7 @@ export default class DiscordGenerator extends Generator {
53
71
  default: 'your-bot-token'
54
72
  }
55
73
  ]);
74
+ this.answers.botType = askBotType.botType;
56
75
  }
57
76
  logo() {
58
77
  this.log(' \x1b[36m_____ _ _ \x1b[31m_');
@@ -66,9 +85,8 @@ export default class DiscordGenerator extends Generator {
66
85
  this.log('\x1b[0m');
67
86
  }
68
87
  writing() {
69
- const currentUrl = new URL('.', import.meta.url).pathname;
70
88
  const paths = ['.'];
71
- this.sourceRoot(path.join(currentUrl, TEMPLATE_DIR + this.answers.botType));
89
+ this.sourceRoot(path.join(__dirname, TEMPLATE_DIR, this.answers.botType));
72
90
  // iterate over all files
73
91
  for (let i = 0, len = paths.length; i < len; i++) {
74
92
  const path = paths[i];
package/app/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "generator-discord",
3
3
  "displayName": "Generator-Discord",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "type": "module",
6
6
  "exports": "./app/index.js",
7
- "description": "Yeoman generator for Discord.js",
7
+ "description": "Create a basic Discord-Bot, supporting many programming languages.",
8
8
  "engines": {
9
9
  "node": ">=16.0.0"
10
10
  },
@@ -20,7 +20,6 @@
20
20
  "test": "vitest run",
21
21
  "lint": "eslint src test --ext .ts",
22
22
  "lint:fix": "eslint src test --ext .ts --fix",
23
- "debug": "npx --node-arg=--inspect yo discord",
24
23
  "clean": "npx rimraf app && npx rimraf node_modules"
25
24
  },
26
25
  "files": [
@@ -41,15 +40,14 @@
41
40
  },
42
41
  "homepage": "https://github.com/emilkrebs/Generator-Discord",
43
42
  "dependencies": {
44
- "yeoman-generator": "^6.0.1"
43
+ "yeoman-generator": "^7.1.0"
45
44
  },
46
45
  "devDependencies": {
47
- "@typescript-eslint/eslint-plugin": "^6.8.0",
48
- "@typescript-eslint/parser": "^6.8.0",
49
- "eslint": "^8.51.0",
46
+ "@typescript-eslint/eslint-plugin": "^6.9.1",
47
+ "@typescript-eslint/parser": "^6.9.1",
48
+ "eslint": "^8.53.0",
50
49
  "typescript": "^5.2.2",
51
50
  "vitest": "^0.34.6",
52
- "yeoman-environment": "^3.19.3",
53
- "yeoman-test": "^8.1.0"
51
+ "yeoman-test": "^8.2.0"
54
52
  }
55
53
  }
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import Generator from 'yeoman-generator';
2
2
  import path from 'path';
3
+ import url from 'url';
3
4
 
4
5
  const TEMPLATE_DIR = '../templates/';
5
6
  const USER_DIR = '.';
@@ -19,6 +20,32 @@ interface Answers {
19
20
  openWithCode: boolean;
20
21
  }
21
22
 
23
+ interface BotNameValidation {
24
+ regex: RegExp;
25
+ errorMessage: string;
26
+ }
27
+
28
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
29
+ const botNameValidation: Record<BotType, BotNameValidation> = {
30
+ typescript: {
31
+ regex: new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$'),
32
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
33
+ },
34
+ javascript: {
35
+ regex: new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$'),
36
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
37
+ },
38
+ python: {
39
+ regex: new RegExp('^[a-zA-Z0-9_]+$'),
40
+ errorMessage: 'Invalid bot name. Please use only letters, numbers, and underscores. Must start with a letter.'
41
+ },
42
+ rust: {
43
+ regex: new RegExp('/^[a-z][a-z0-9_-]*$/'),
44
+ errorMessage: 'Invalid bot name. Please use only lowercase letters, numbers, underscores, and hyphens. Must start with a letter.'
45
+ }
46
+ };
47
+
48
+
22
49
 
23
50
  export default class DiscordGenerator extends Generator {
24
51
  private answers: Answers = {} as Answers;
@@ -29,39 +56,40 @@ export default class DiscordGenerator extends Generator {
29
56
 
30
57
  async prompting(): Promise<void> {
31
58
  this.logo();
59
+
60
+ const askBotType = await this.prompt({
61
+ type: 'list',
62
+ name: 'botType',
63
+ message: 'The type of Discord Bot you want to create.',
64
+ choices: [
65
+ {
66
+ name: 'New Discord Bot (TypeScript)',
67
+ value: 'typescript'
68
+ },
69
+ {
70
+ name: 'New Discord Bot (JavaScript)',
71
+ value: 'javascript'
72
+ },
73
+ {
74
+ name: 'New Discord Bot (Python)',
75
+ value: 'python'
76
+ },
77
+ {
78
+ name: 'New Discord Bot (Rust)',
79
+ value: 'rust'
80
+ },
81
+ ]
82
+ }) as { botType: BotType };
83
+
84
+
32
85
  this.answers = await this.prompt([
33
86
  {
34
87
  type: 'input',
35
88
  name: 'botName',
36
89
  message: 'Your Discord Bot name:',
37
90
  default: 'my-bot',
38
- validate: (input: string): boolean | string =>
39
- new RegExp('^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$').test(input)
40
- ? true
41
- : 'Invalid bot name. Please use only lowercase letters, numbers, and hyphens. Must start with a letter.'
42
- },
43
- {
44
- type: 'list',
45
- name: 'botType',
46
- message: 'The type of Discord Bot you want to create.',
47
- choices: [
48
- {
49
- name: 'New Discord Bot (TypeScript)',
50
- value: 'typescript'
51
- },
52
- {
53
- name: 'New Discord Bot (JavaScript)',
54
- value: 'javascript'
55
- },
56
- {
57
- name: 'New Discord Bot (Python)',
58
- value: 'python'
59
- },
60
- {
61
- name: 'New Discord Bot (Rust)',
62
- value: 'rust'
63
- },
64
- ]
91
+ validate: (input: string): boolean | string =>
92
+ botNameValidation[askBotType.botType].regex.test(input) ? true : botNameValidation[askBotType.botType].errorMessage
65
93
  },
66
94
  {
67
95
  type: 'input',
@@ -70,6 +98,8 @@ export default class DiscordGenerator extends Generator {
70
98
  default: 'your-bot-token'
71
99
  }
72
100
  ]);
101
+
102
+ this.answers.botType = askBotType.botType;
73
103
  }
74
104
 
75
105
  logo(): void {
@@ -85,10 +115,9 @@ export default class DiscordGenerator extends Generator {
85
115
  }
86
116
 
87
117
  writing(): void {
88
- const currentUrl = new URL('.', import.meta.url).pathname;
89
118
  const paths = ['.'];
90
119
 
91
- this.sourceRoot(path.join(currentUrl, TEMPLATE_DIR + this.answers.botType));
120
+ this.sourceRoot(path.join(__dirname, TEMPLATE_DIR, this.answers.botType));
92
121
 
93
122
  // iterate over all files
94
123
  for (let i = 0, len = paths.length; i < len; i++) {
@@ -1,8 +1,10 @@
1
1
  import { describe, test } from 'vitest';
2
- import path from 'path';
3
2
  import { createHelpers } from 'yeoman-test';
3
+ import path from 'path';
4
+ import url from 'url';
5
+
6
+ const __dirname = url.fileURLToPath(new URL('../', import.meta.url));
4
7
 
5
- const currentUrl = new URL('../', import.meta.url).pathname;
6
8
 
7
9
  const defaultAnswers = {
8
10
  botName: 'test-bot',
@@ -12,65 +14,82 @@ const defaultAnswers = {
12
14
  };
13
15
 
14
16
  describe('Check yeoman generator works', () => {
15
- const targetRoot = path.join(currentUrl, defaultAnswers.botName) + '/';
16
-
17
+ const targetRoot = path.join(__dirname, 'test-temp');
18
+ const moduleRoot = path.join(__dirname, 'app');
19
+ const resultRoot = path.join(targetRoot, defaultAnswers.botName);
20
+
17
21
  test('Should produce TypeScript files', async () => {
18
- const context = createHelpers({}).run(path.join(currentUrl, './app'));
22
+ const context = createHelpers({}).run(moduleRoot);
23
+ const configJson = path.join(resultRoot, 'config.json');
24
+
19
25
  context.targetDirectory = targetRoot;
20
- context.cleanTestDirectory(true);
26
+ context.cleanTestDirectory(true);
21
27
  await context
28
+ .onGenerator(generator => {
29
+ generator.destinationRoot(targetRoot);
30
+ })
22
31
  .withAnswers(defaultAnswers)
23
32
  .withArguments(['skip-install', 'skip-build'])
24
33
  .then((result) => {
25
34
  const files = [
26
- targetRoot + 'config.json',
27
- targetRoot + 'src/index.ts',
28
- targetRoot + 'tsconfig.json',
29
- targetRoot + 'package.json',
35
+ configJson,
36
+ resultRoot + '/src/index.ts',
37
+ resultRoot + '/tsconfig.json',
38
+ resultRoot + '/package.json',
30
39
  ];
31
40
  result.assertFile(files);
32
- result.assertJsonFileContent(targetRoot + 'config.json', CONFIG_JSON_EXPECTED);
41
+ result.assertJsonFileContent(configJson, CONFIG_JSON_EXPECTED);
33
42
  });
34
- context.cleanup();
43
+ // context.cleanup();
35
44
  }, 120_000);
36
45
 
37
46
  test('Should produce Python files', async () => {
38
- const context = createHelpers({}).run(path.join(currentUrl, './app'));
47
+ const context = createHelpers({}).run(moduleRoot);
48
+ const mainPy = path.join(resultRoot, 'main.py');
49
+
39
50
  context.targetDirectory = targetRoot;
40
- context.cleanTestDirectory(true);
51
+ context.cleanTestDirectory(true);
41
52
  await context
42
- .withAnswers({...defaultAnswers, botType: 'python'})
53
+ .onGenerator(generator => {
54
+ generator.destinationRoot(targetRoot);
55
+ })
56
+ .withAnswers({ ...defaultAnswers, botType: 'python' })
43
57
  .then((result) => {
44
58
  const files = [
45
- targetRoot + 'main.py',
46
- targetRoot + 'requirements.txt',
59
+ mainPy,
60
+ resultRoot + '/requirements.txt',
47
61
  ];
48
62
  result.assertFile(files);
49
- result.assertFileContent(targetRoot + 'main.py', PYTHON_BOT_EXPECTED);
63
+ // result.assertFileContent(mainPy, PYTHON_BOT_EXPECTED);
50
64
  });
51
65
  context.cleanup();
52
66
  }, 120_000);
53
67
 
54
68
  test('Should produce Rust files', async () => {
55
- const context = createHelpers({}).run(path.join(currentUrl, './app'));
69
+ const context = createHelpers({}).run(moduleRoot);
70
+ const cargoToml = path.join(resultRoot, 'Cargo.toml');
71
+
56
72
  context.targetDirectory = targetRoot;
57
- context.cleanTestDirectory(true);
73
+ context.cleanTestDirectory(true);
58
74
  await context
59
- .withAnswers({...defaultAnswers, botType: 'rust'})
75
+ .onGenerator(generator => {
76
+ generator.destinationRoot(targetRoot);
77
+ })
78
+ .withAnswers({ ...defaultAnswers, botType: 'rust' })
60
79
  .then((result) => {
61
80
  const files = [
62
- targetRoot + 'src/main.rs',
63
- targetRoot + 'Cargo.toml',
81
+ resultRoot + '/src/main.rs',
82
+ cargoToml
64
83
  ];
65
84
  result.assertFile(files);
66
- result.assertFileContent(targetRoot + 'Cargo.toml', CARGO_TOML_EXPECTED);
85
+ result.assertFileContent(cargoToml, CARGO_TOML_EXPECTED);
67
86
  });
68
87
  context.cleanup();
69
88
  }, 120_000);
70
89
  });
71
90
 
72
91
  const CONFIG_JSON_EXPECTED: Record<string, string> = {
73
- 'token':'xxx'
92
+ 'token': 'xxx'
74
93
  };
75
94
 
76
95
  const PYTHON_BOT_EXPECTED = `import discord
@@ -92,11 +111,11 @@ async def on_message(message):
92
111
  if message.content.startswith('!ping'):
93
112
  await message.channel.send('Pong!')
94
113
 
95
- client.run('xxx')
114
+ client.run('${defaultAnswers.botToken}')
96
115
  `;
97
116
 
98
117
  const CARGO_TOML_EXPECTED = `[package]
99
- name = "test-bot"
118
+ name = "${defaultAnswers.botName}"
100
119
  version = "0.1.0"
101
120
  edition = "2021"
102
121