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.
- package/app/index.d.ts.map +1 -1
- package/app/index.js +46 -28
- package/app/index.js.map +1 -1
- package/package.json +7 -9
- package/src/index.ts +58 -29
- package/test/generator.test.ts +46 -27
package/app/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;
|
|
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) =>
|
|
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(
|
|
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":"AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
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.
|
|
4
|
+
"version": "1.3.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": "./app/index.js",
|
|
7
|
-
"description": "
|
|
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": "^
|
|
43
|
+
"yeoman-generator": "^7.1.0"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
48
|
-
"@typescript-eslint/parser": "^6.
|
|
49
|
-
"eslint": "^8.
|
|
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-
|
|
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
|
-
|
|
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(
|
|
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++) {
|
package/test/generator.test.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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(
|
|
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(
|
|
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
|
-
.
|
|
53
|
+
.onGenerator(generator => {
|
|
54
|
+
generator.destinationRoot(targetRoot);
|
|
55
|
+
})
|
|
56
|
+
.withAnswers({ ...defaultAnswers, botType: 'python' })
|
|
43
57
|
.then((result) => {
|
|
44
58
|
const files = [
|
|
45
|
-
|
|
46
|
-
|
|
59
|
+
mainPy,
|
|
60
|
+
resultRoot + '/requirements.txt',
|
|
47
61
|
];
|
|
48
62
|
result.assertFile(files);
|
|
49
|
-
result.assertFileContent(
|
|
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(
|
|
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
|
-
.
|
|
75
|
+
.onGenerator(generator => {
|
|
76
|
+
generator.destinationRoot(targetRoot);
|
|
77
|
+
})
|
|
78
|
+
.withAnswers({ ...defaultAnswers, botType: 'rust' })
|
|
60
79
|
.then((result) => {
|
|
61
80
|
const files = [
|
|
62
|
-
|
|
63
|
-
|
|
81
|
+
resultRoot + '/src/main.rs',
|
|
82
|
+
cargoToml
|
|
64
83
|
];
|
|
65
84
|
result.assertFile(files);
|
|
66
|
-
result.assertFileContent(
|
|
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('
|
|
114
|
+
client.run('${defaultAnswers.botToken}')
|
|
96
115
|
`;
|
|
97
116
|
|
|
98
117
|
const CARGO_TOML_EXPECTED = `[package]
|
|
99
|
-
name = "
|
|
118
|
+
name = "${defaultAnswers.botName}"
|
|
100
119
|
version = "0.1.0"
|
|
101
120
|
edition = "2021"
|
|
102
121
|
|