creatium 0.0.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/README.md ADDED
@@ -0,0 +1,852 @@
1
+ <!-- AUTOGEN BY DOVENV - START
2
+ Do not edit this file -->
3
+
4
+ # Creatium
5
+
6
+ [![Web](https://img.shields.io/badge/Web-grey?style=for-the-badge&logoColor=white)](https://pigeonposse.com)
7
+ [![About Us](https://img.shields.io/badge/About%20Us-grey?style=for-the-badge&logoColor=white)](https://pigeonposse.com?popup=about)
8
+ [![Donate](https://img.shields.io/badge/Donate-pink?style=for-the-badge&logoColor=white)](https://pigeonposse.com/?popup=donate)
9
+ [![Github](https://img.shields.io/badge/Github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/pigeonposse)
10
+ [![Twitter](https://img.shields.io/badge/Twitter-black?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/pigeonposse_)
11
+ [![Instagram](https://img.shields.io/badge/Instagram-black?style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/pigeon.posse/)
12
+ [![Medium](https://img.shields.io/badge/Medium-black?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@pigeonposse)
13
+
14
+
15
+ {{desc}}
16
+
17
+ ## Table of contents
18
+
19
+ - [🔑 Installation](#-installation)
20
+ - [🤔 What is it Creatium?](#-what-is-it-creatium)
21
+ - [🚀 Usage](#-usage)
22
+ - [Project structure](#project-structure)
23
+ - [src/main.js](#srcmainjs)
24
+ - [src/bin.js](#srcbinjs)
25
+ - [src/lib.js](#srclibjs)
26
+ - [package.json](#packagejson)
27
+ - [templates](#templates)
28
+ - [Api documentation](#api-documentation)
29
+ - [Classes](#classes)
30
+ - [Creatium](#creatium)
31
+ - [CreatiumPrompt\<C\>](#creatiumpromptc)
32
+ - [Type Aliases](#type-aliases)
33
+ - [CliOpts](#cliopts)
34
+ - [Config](#config)
35
+ - [CreateOpts](#createopts)
36
+ - [CreateTemplateOpts](#createtemplateopts)
37
+ - [Variables](#variables)
38
+ - [OPTIONS](#options)
39
+ - [prompt](#prompt)
40
+ - [Namespaces](#namespaces)
41
+ - [👨‍💻 Development](#-development)
42
+ - [☕ Donate](#-donate)
43
+ - [📜 License](#-license)
44
+ - [🐦 About us](#-about-us)
45
+
46
+
47
+ ## 🔑 Installation
48
+
49
+ ```bash
50
+ npm install creatium
51
+ # or
52
+ pnpm add creatium
53
+ # or
54
+ yarn add creatium
55
+ # or
56
+ deno install creatium
57
+ # or
58
+ bun add creatium
59
+ ```
60
+
61
+ ## 🤔 What is it Creatium?
62
+
63
+ Creatium is a CLI and Library for creating project templates.
64
+
65
+ > Useful for create-binaries like `pnpm create backan`
66
+
67
+ [Read more](https://www.npmjs.com/package/creatium)
68
+
69
+ ## 🚀 Usage
70
+
71
+ Create a cli and a library project with `creatium`
72
+
73
+ Simple usage example:
74
+
75
+ ### Project structure
76
+
77
+ Create a project with the following structure:
78
+
79
+ ```bash
80
+ 📂 src
81
+ ├── bin.js
82
+ ├── lib.js
83
+ └── main.js
84
+ 📂 templates
85
+ └── 📂 js-project
86
+ └── 📂 ts-project
87
+ 📄 package.json
88
+ ```
89
+
90
+ ### src/main.js
91
+
92
+ Create a new instance of `creatium` and export it as `core`
93
+
94
+ ```javascript
95
+
96
+ import { dirname, join } from 'node:path'
97
+ import { fileURLToPath } from 'node:url'
98
+ import { version } from './package.json'
99
+ import { Creatium } from 'creatium'
100
+
101
+ const currentDir = join( dirname( fileURLToPath( import.meta.url ) ) )
102
+ const templatesDir = join( currentDir, '..', 'templates' )
103
+
104
+ export const core = new Creatium( {
105
+ name: 'Simple test',
106
+ version,
107
+ templates : {
108
+ js : {
109
+ input : join( templatesDir, 'js-project' ),
110
+ name : 'JavaScript project',
111
+ },
112
+ ts : {
113
+ input : join( templatesDir, 'ts-project' ),
114
+ name : 'TypeScript project',
115
+ },
116
+ },
117
+ } )
118
+ ```
119
+
120
+ ### src/bin.js
121
+
122
+ Create a bin file and call the `cli` method of the `core` instance.
123
+
124
+ ```javascript
125
+
126
+ // create cli
127
+ import { core } from './main.js'
128
+ await core.cli()
129
+ ```
130
+
131
+ ### src/lib.js
132
+
133
+ Create a library file and export the `create` function for use outside.
134
+
135
+ ```javascript
136
+ import { core } from './main.js'
137
+
138
+ /**
139
+ * Create project template.
140
+ * @param {Parameters<typeof core.build>[0]} params - The parameters required for creation.
141
+ * @returns {Promise<Object>} A promise that resolves to the result of the creation process.
142
+ */
143
+ export const create = async ( params ) => {
144
+
145
+ return await core.build( params )
146
+
147
+ }
148
+ ```
149
+
150
+ ### package.json
151
+
152
+ ```json
153
+ {
154
+ "name": "create-{my-library-name}",
155
+ "version": "0.0.1",
156
+ "type": "module",
157
+ "main": "src/lib.js",
158
+ "module": "src/lib.js",
159
+ "bin": {
160
+ "create-{my-library-name}": "bin.js"
161
+ },
162
+ "files": [
163
+ "src",
164
+ "templates",
165
+ ]
166
+ }
167
+ ```
168
+
169
+ ### templates
170
+
171
+ Create a template folder with your templates.
172
+
173
+
174
+ ## Api documentation
175
+
176
+ ### Classes
177
+
178
+ #### Creatium
179
+
180
+ ##### Constructors
181
+
182
+ ###### new Creatium()
183
+
184
+ ```ts
185
+ new Creatium(options: {
186
+ cache: boolean;
187
+ consts: Record<string, string>;
188
+ intro: false | (data: HookParams) => Response<void>;
189
+ name: string;
190
+ onCancel: false | (data: HookParams) => Response<void>;
191
+ opts: {
192
+ install: false | [
193
+ | "deno"
194
+ | "bun"
195
+ | "npm"
196
+ | "pnpm"
197
+ | "yarn",
198
+ | "deno"
199
+ | "bun"
200
+ | "npm"
201
+ | "pnpm"
202
+ | "yarn", ...("deno" | "bun" | "npm" | "pnpm" | "yarn")[]];
203
+ name: boolean;
204
+ openEditor: false | ["code" | "subl" | "webstorm", "code" | "subl" | "webstorm", ...("code" | "subl" | "webstorm")[]];
205
+ };
206
+ outro: false | (data: HookParams) => Response<void>;
207
+ templates: {};
208
+ updater: boolean;
209
+ version: string;
210
+ }): Creatium
211
+ ```
212
+
213
+ ###### Parameters
214
+
215
+ | Parameter | Type | Description |
216
+ | ------ | ------ | ------ |
217
+ | `options` | `object` | - |
218
+ | `options.cache`? | `boolean` | Use cache **Default** `true` |
219
+ | `options.consts`? | `Record`\<`string`, `string`\> | Add consts to use in your templates. |
220
+ | `options.intro`? | `false` \| (`data`: `HookParams`) => `Response`\<`void`\> | - |
221
+ | `options.name` | `string` | Set name of you project |
222
+ | `options.onCancel`? | `false` \| (`data`: `HookParams`) => `Response`\<`void`\> | - |
223
+ | `options.opts`? | `object` | - |
224
+ | `options.opts.install`? | `false` \| [ \| `"deno"` \| `"bun"` \| `"npm"` \| `"pnpm"` \| `"yarn"`, \| `"deno"` \| `"bun"` \| `"npm"` \| `"pnpm"` \| `"yarn"`, ...("deno" \| "bun" \| "npm" \| "pnpm" \| "yarn")\[\]] | - |
225
+ | `options.opts.name`? | `boolean` | - |
226
+ | `options.opts.openEditor`? | `false` \| [`"code"` \| `"subl"` \| `"webstorm"`, `"code"` \| `"subl"` \| `"webstorm"`, ...("code" \| "subl" \| "webstorm")\[\]] | - |
227
+ | `options.outro`? | `false` \| (`data`: `HookParams`) => `Response`\<`void`\> | - |
228
+ | `options.templates` | `object` | Set your template ooptions |
229
+ | `options.updater`? | `boolean` | Use updater **Default** `false` |
230
+ | `options.version` | `string` | Set version of you current project Used in for the updater notifications. |
231
+
232
+ ###### Returns
233
+
234
+ [`Creatium`](index.md#creatium)
235
+
236
+ ##### Methods
237
+
238
+ ###### build()
239
+
240
+ ```ts
241
+ build(values?: {
242
+ input: string;
243
+ install: PkgManager;
244
+ name: string;
245
+ openEditor: TextEditor;
246
+ output: string;
247
+ }, opts?: CreateOpts): Promise<{
248
+ input: string;
249
+ install: undefined;
250
+ name: undefined;
251
+ openEditor: undefined;
252
+ output: string;
253
+ }>
254
+ ```
255
+
256
+ A simplified version of the `build` method from the main class.
257
+
258
+ ###### Parameters
259
+
260
+ | Parameter | Type | Description |
261
+ | ------ | ------ | ------ |
262
+ | `values`? | `object` | The values to override the CLI prompts. If not set, the CLI prompts will be executed. |
263
+ | `values.input`? | `string` | Set the input path or the template key |
264
+ | `values.install`? | `PkgManager` | Set the installer |
265
+ | `values.name`? | `string` | Set the name of the template |
266
+ | `values.openEditor`? | `TextEditor` | Open editor |
267
+ | `values.output`? | `string` | Set the output path |
268
+ | `opts`? | [`CreateOpts`](index.md#createopts) | The options to pass to the CLI. |
269
+
270
+ ###### Returns
271
+
272
+ `Promise`\<\{
273
+ `input`: `string`;
274
+ `install`: `undefined`;
275
+ `name`: `undefined`;
276
+ `openEditor`: `undefined`;
277
+ `output`: `string`;
278
+ \}\>
279
+
280
+ A promise resolving to the prompt values obtained after executing the CLI.
281
+
282
+ | Name | Type |
283
+ | ------ | ------ |
284
+ | `input`? | `string` |
285
+ | `install`? | `undefined` |
286
+ | `name`? | `undefined` |
287
+ | `openEditor`? | `undefined` |
288
+ | `output`? | `string` |
289
+
290
+ ###### Examples
291
+
292
+ ```ts
293
+ // simple usage
294
+ await core.build()
295
+ ```
296
+
297
+ ```ts
298
+ // custom usage
299
+ await core.build( { args : process.argv.slice(4), hideBin : false } )
300
+ ```
301
+
302
+ ###### cli()
303
+
304
+ ```ts
305
+ cli(props?: CliOpts): Promise<{
306
+ input: string;
307
+ install: undefined;
308
+ name: undefined;
309
+ openEditor: undefined;
310
+ output: string;
311
+ }>
312
+ ```
313
+
314
+ A simplified version of the `cli` method from the main class.
315
+ Initializes and executes the command-line interface (CLI) process.
316
+
317
+ ###### Parameters
318
+
319
+ | Parameter | Type | Description |
320
+ | ------ | ------ | ------ |
321
+ | `props`? | [`CliOpts`](index.md#cliopts) | Optional CLI options to configure the initialization process. |
322
+
323
+ ###### Returns
324
+
325
+ `Promise`\<\{
326
+ `input`: `string`;
327
+ `install`: `undefined`;
328
+ `name`: `undefined`;
329
+ `openEditor`: `undefined`;
330
+ `output`: `string`;
331
+ \}\>
332
+
333
+ A promise resolving to the prompt values obtained after executing the CLI.
334
+
335
+ | Name | Type |
336
+ | ------ | ------ |
337
+ | `input`? | `string` |
338
+ | `install`? | `undefined` |
339
+ | `name`? | `undefined` |
340
+ | `openEditor`? | `undefined` |
341
+ | `output`? | `string` |
342
+
343
+ ###### Examples
344
+
345
+ ```ts
346
+ // simple usage
347
+ await core.cli()
348
+ ```
349
+
350
+ ```ts
351
+ // custom usage
352
+ await core.cli( { args : process.argv.slice(4), hideBin : false } )
353
+ ```
354
+
355
+ ***
356
+
357
+ #### CreatiumPrompt\<C\>
358
+
359
+ Build a CLI with prompts for create project templates.
360
+
361
+ ##### Example
362
+
363
+ ```ts
364
+ const core = new CreatiumPrompt({
365
+ name: 'My Project',
366
+ version: '1.0.0',
367
+ ...
368
+ })
369
+
370
+ core.cli()
371
+ ```
372
+
373
+ ##### Type Parameters
374
+
375
+ | Type Parameter | Default type | Description |
376
+ | ------ | ------ | ------ |
377
+ | `C` *extends* [`Config`](index.md#config) | [`Config`](index.md#config) | |
378
+
379
+ ##### Accessors
380
+
381
+ ###### debugMode
382
+
383
+ ###### Set Signature
384
+
385
+ ```ts
386
+ set debugMode(value: boolean): void
387
+ ```
388
+
389
+ Force debug mode
390
+
391
+ ###### Parameters
392
+
393
+ | Parameter | Type |
394
+ | ------ | ------ |
395
+ | `value` | `boolean` |
396
+
397
+ ###### Returns
398
+
399
+ `void`
400
+
401
+ ##### Constructors
402
+
403
+ ###### new CreatiumPrompt()
404
+
405
+ ```ts
406
+ new CreatiumPrompt<C>(config: C): CreatiumPrompt<C>
407
+ ```
408
+
409
+ ###### Parameters
410
+
411
+ | Parameter | Type |
412
+ | ------ | ------ |
413
+ | `config` | `C` |
414
+
415
+ ###### Returns
416
+
417
+ [`CreatiumPrompt`](index.md#creatiumpromptc)\<`C`\>
418
+
419
+ ##### Methods
420
+
421
+ ###### build()
422
+
423
+ ```ts
424
+ build(values?: { [K in string | number | symbol]: { [K in string | number | symbol]: { [K in string | number | symbol]?: { [K in string | number | symbol]: ((...)[(...)] extends Object ? (...) extends (...) ? (...) : (...) : never)[K] } }[K] }[K] }, opts?: CreateOpts): Promise<{ [K_1 in string | number | symbol]?: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ("prompt" extends keyof (...)[(...)] ? Awaited<ReturnType<(...)>> : never) extends T_7 ? { [K_3 in string | number | symbol]: ((...) extends (...) ? (...) : (...))[K_3] } : never : never : never) extends T_5 ? { [K_2 in string | number | symbol]: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T_6 ? { [K_3 in (...)]: (...) } : never : never : never)[K_2] } : never } extends T ? { [K in string | number | symbol]: { [K_1 in string | number | symbol]?: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T_4 ? { [K_3 in (...)]: (...) } : never : never : never) extends T_1 ? { [K_2 in string | number | symbol]: ((...)[(...)] extends Object ? (...) extends (...) ? (...) : (...) : never)[K_2] } : never }[K] } : never>
425
+ ```
426
+
427
+ Initialize the CLI and executes the callback function passed in the config.
428
+
429
+ ###### Parameters
430
+
431
+ | Parameter | Type | Description |
432
+ | ------ | ------ | ------ |
433
+ | `values`? | \{ \[K in string \| number \| symbol\]: \{ \[K in string \| number \| symbol\]: \{ \[K in string \| number \| symbol\]?: \{ \[K in string \| number \| symbol\]: ((...)\[(...)\] extends Object ? (...) extends (...) ? (...) : (...) : never)\[K\] \} \}\[K\] \}\[K\] \} | The values to override the CLI prompts. If not set, the CLI prompts will be executed. |
434
+ | `opts`? | [`CreateOpts`](index.md#createopts) | The options to pass to the CLI. |
435
+
436
+ ###### Returns
437
+
438
+ `Promise`\<\{ \[K\_1 in string \| number \| symbol\]?: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ("prompt" extends keyof (...)\[(...)\] ? Awaited\<ReturnType\<(...)\>\> : never) extends T\_7 ? \{ \[K\_3 in string \| number \| symbol\]: ((...) extends (...) ? (...) : (...))\[K\_3\] \} : never : never : never) extends T\_5 ? \{ \[K\_2 in string \| number \| symbol\]: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T\_6 ? \{ \[K\_3 in (...)\]: (...) \} : never : never : never)\[K\_2\] \} : never \} *extends* `T` ? \{ \[K in string \| number \| symbol\]: \{ \[K\_1 in string \| number \| symbol\]?: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T\_4 ? \{ \[K\_3 in (...)\]: (...) \} : never : never : never) extends T\_1 ? \{ \[K\_2 in string \| number \| symbol\]: ((...)\[(...)\] extends Object ? (...) extends (...) ? (...) : (...) : never)\[K\_2\] \} : never \}\[K\] \} : `never`\>
439
+
440
+ The result of the callback function.
441
+
442
+ ###### cli()
443
+
444
+ ```ts
445
+ cli(props?: CliOpts): Promise<{ [K_1 in string | number | symbol]?: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ("prompt" extends keyof (...)[(...)] ? Awaited<ReturnType<(...)>> : never) extends T_7 ? { [K_3 in string | number | symbol]: ((...) extends (...) ? (...) : (...))[K_3] } : never : never : never) extends T_5 ? { [K_2 in string | number | symbol]: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T_6 ? { [K_3 in (...)]: (...) } : never : never : never)[K_2] } : never } extends T ? { [K in string | number | symbol]: { [K_1 in string | number | symbol]?: (C["prompt"][K_1] extends Object ? T_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T_4 ? { [K_3 in (...)]: (...) } : never : never : never) extends T_1 ? { [K_2 in string | number | symbol]: ((...)[(...)] extends Object ? (...) extends (...) ? (...) : (...) : never)[K_2] } : never }[K] } : never>
446
+ ```
447
+
448
+ Initializes and executes the command-line interface (CLI) process.
449
+
450
+ ###### Parameters
451
+
452
+ | Parameter | Type | Description |
453
+ | ------ | ------ | ------ |
454
+ | `props`? | [`CliOpts`](index.md#cliopts) | Optional CLI options to configure the initialization process. |
455
+
456
+ ###### Returns
457
+
458
+ `Promise`\<\{ \[K\_1 in string \| number \| symbol\]?: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ("prompt" extends keyof (...)\[(...)\] ? Awaited\<ReturnType\<(...)\>\> : never) extends T\_7 ? \{ \[K\_3 in string \| number \| symbol\]: ((...) extends (...) ? (...) : (...))\[K\_3\] \} : never : never : never) extends T\_5 ? \{ \[K\_2 in string \| number \| symbol\]: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T\_6 ? \{ \[K\_3 in (...)\]: (...) \} : never : never : never)\[K\_2\] \} : never \} *extends* `T` ? \{ \[K in string \| number \| symbol\]: \{ \[K\_1 in string \| number \| symbol\]?: (C\["prompt"\]\[K\_1\] extends Object ? T\_2 extends keyof OptionsClasses ? ((...) extends (...) ? (...) : (...)) extends T\_4 ? \{ \[K\_3 in (...)\]: (...) \} : never : never : never) extends T\_1 ? \{ \[K\_2 in string \| number \| symbol\]: ((...)\[(...)\] extends Object ? (...) extends (...) ? (...) : (...) : never)\[K\_2\] \} : never \}\[K\] \} : `never`\>
459
+
460
+ A promise resolving to the prompt values obtained after executing the CLI.
461
+
462
+ ###### Examples
463
+
464
+ ```ts
465
+ // simple usage
466
+ `await core.cli()`
467
+ ```
468
+
469
+ ```ts
470
+ // custom usage
471
+ `await core.cli( { args : process.argv.slice( 4), hideBin : false } )`
472
+ ```
473
+
474
+ ###### createTemplate()
475
+
476
+ ```ts
477
+ createTemplate(values: CreateTemplateOpts): Promise<void>
478
+ ```
479
+
480
+ Create a new project template.
481
+
482
+ ###### Parameters
483
+
484
+ | Parameter | Type | Description |
485
+ | ------ | ------ | ------ |
486
+ | `values` | [`CreateTemplateOpts`](index.md#createtemplateopts) | The values to create the template. |
487
+
488
+ ###### Returns
489
+
490
+ `Promise`\<`void`\>
491
+
492
+ - A promise that resolves when the template is created.
493
+
494
+ ###### Examples
495
+
496
+ ```ts
497
+ // basic usage
498
+ await core.createTemplate( { input : 'my/template/path', output : 'my/project/path' } )
499
+ ```
500
+
501
+ ```ts
502
+ // custom usage
503
+ await core.createTemplate( {
504
+ input : 'my/template/path',
505
+ output : 'my/project/path',
506
+ install : 'pnpm',
507
+ open : 'vscode',
508
+ consts : {
509
+ version : '1.0.0',
510
+ header : '// Template generated by Creatium. a project from PigeonPosse',
511
+ },
512
+ } )
513
+ ```
514
+
515
+ ##### Properties
516
+
517
+ | Property | Type |
518
+ | ------ | ------ |
519
+ | `config` | `C` |
520
+ | `utils` | \{ `env`: *typeof* [`env`](namespaces/env.md); `prompt`: \{ `box`: (`opts`: \{ `opts`: `Options`; `type`: `PromptLineMethod`; `value`: `string`; \}) => `void`; `cancel`: (`message`?: `string`) => `void`; `columns`: (`opts`: \{ `opts`: `GlobalOptions`; `type`: `PromptLineMethod`; `value`: `ColumnData`; \}) => `void`; `confirm`: (`opts`: `ConfirmOptions`) => `Promise`\<`boolean` \| `symbol`\>; `group`: \<`T`\>(`prompts`: `PromptGroup`\<`T`\>, `opts`?: `PromptGroupOptions`\<`T`\>) => `Promise`\<\{ \[P in string \| number \| symbol\]: PromptGroupAwaitedReturn\<T\>\[P\] \}\>; `groupMultiselect`: \<`Value`\>(`opts`: `GroupMultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\>; `intro`: (`title`?: `string`) => `void`; `isCancel`: (`value`: `unknown`) => `value is symbol`; `log`: \{ `error`: (`message`: `string`) => `void`; `info`: (`message`: `string`) => `void`; `message`: (`message`?: `string`, `__namedParameters`?: `LogMessageOptions`) => `void`; `step`: (`message`: `string`) => `void`; `success`: (`message`: `string`) => `void`; `warn`: (`message`: `string`) => `void`; `warning`: (`message`: `string`) => `void`; \}; `multiselect`: \<`Value`\>(`opts`: `MultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\>; `note`: (`message`?: `string`, `title`?: `string`) => `void`; `number`: (`opts`: \{ `defaultValue`: `string`; `errorText`: `string`; `initialValue`: `string`; `message`: `string`; `placeholder`: `string`; `validate`: (`value`: `string`) => `string` \| `void`; \}) => `Promise`\<`number` \| `symbol`\>; `outro`: (`message`?: `string`) => `void`; `password`: (`opts`: `PasswordOptions`) => `Promise`\<`string` \| `symbol`\>; `select`: \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\>; `selectKey`: \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\>; `spinner`: () => \{ `message`: (`msg`?: `string`) => `void`; `start`: (`msg`?: `string`) => `void`; `stop`: (`msg`?: `string`, `code`?: `number`) => `void`; \}; `table`: (`opts`: \{ `opts`: `TableUserConfig`; `type`: `PromptLineMethod`; `value`: `TableData`; \}) => `void`; `tasks`: (`tasks`: `Task`[]) => `Promise`\<`void`\>; `text`: (`opts`: `TextOptions`) => `Promise`\<`string` \| `symbol`\>; \}; `style`: *typeof* [`style`](namespaces/style.md); \} |
521
+ | `utils.env` | *typeof* [`env`](namespaces/env.md) |
522
+ | `utils.prompt` | \{ `box`: (`opts`: \{ `opts`: `Options`; `type`: `PromptLineMethod`; `value`: `string`; \}) => `void`; `cancel`: (`message`?: `string`) => `void`; `columns`: (`opts`: \{ `opts`: `GlobalOptions`; `type`: `PromptLineMethod`; `value`: `ColumnData`; \}) => `void`; `confirm`: (`opts`: `ConfirmOptions`) => `Promise`\<`boolean` \| `symbol`\>; `group`: \<`T`\>(`prompts`: `PromptGroup`\<`T`\>, `opts`?: `PromptGroupOptions`\<`T`\>) => `Promise`\<\{ \[P in string \| number \| symbol\]: PromptGroupAwaitedReturn\<T\>\[P\] \}\>; `groupMultiselect`: \<`Value`\>(`opts`: `GroupMultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\>; `intro`: (`title`?: `string`) => `void`; `isCancel`: (`value`: `unknown`) => `value is symbol`; `log`: \{ `error`: (`message`: `string`) => `void`; `info`: (`message`: `string`) => `void`; `message`: (`message`?: `string`, `__namedParameters`?: `LogMessageOptions`) => `void`; `step`: (`message`: `string`) => `void`; `success`: (`message`: `string`) => `void`; `warn`: (`message`: `string`) => `void`; `warning`: (`message`: `string`) => `void`; \}; `multiselect`: \<`Value`\>(`opts`: `MultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\>; `note`: (`message`?: `string`, `title`?: `string`) => `void`; `number`: (`opts`: \{ `defaultValue`: `string`; `errorText`: `string`; `initialValue`: `string`; `message`: `string`; `placeholder`: `string`; `validate`: (`value`: `string`) => `string` \| `void`; \}) => `Promise`\<`number` \| `symbol`\>; `outro`: (`message`?: `string`) => `void`; `password`: (`opts`: `PasswordOptions`) => `Promise`\<`string` \| `symbol`\>; `select`: \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\>; `selectKey`: \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\>; `spinner`: () => \{ `message`: (`msg`?: `string`) => `void`; `start`: (`msg`?: `string`) => `void`; `stop`: (`msg`?: `string`, `code`?: `number`) => `void`; \}; `table`: (`opts`: \{ `opts`: `TableUserConfig`; `type`: `PromptLineMethod`; `value`: `TableData`; \}) => `void`; `tasks`: (`tasks`: `Task`[]) => `Promise`\<`void`\>; `text`: (`opts`: `TextOptions`) => `Promise`\<`string` \| `symbol`\>; \} |
523
+ | `utils.prompt.box` | (`opts`: \{ `opts`: `Options`; `type`: `PromptLineMethod`; `value`: `string`; \}) => `void` |
524
+ | `utils.prompt.cancel` | (`message`?: `string`) => `void` |
525
+ | `utils.prompt.columns` | (`opts`: \{ `opts`: `GlobalOptions`; `type`: `PromptLineMethod`; `value`: `ColumnData`; \}) => `void` |
526
+ | `utils.prompt.confirm` | (`opts`: `ConfirmOptions`) => `Promise`\<`boolean` \| `symbol`\> |
527
+ | `utils.prompt.group` | \<`T`\>(`prompts`: `PromptGroup`\<`T`\>, `opts`?: `PromptGroupOptions`\<`T`\>) => `Promise`\<\{ \[P in string \| number \| symbol\]: PromptGroupAwaitedReturn\<T\>\[P\] \}\> |
528
+ | `utils.prompt.groupMultiselect` | \<`Value`\>(`opts`: `GroupMultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\> |
529
+ | `utils.prompt.intro` | (`title`?: `string`) => `void` |
530
+ | `utils.prompt.isCancel` | (`value`: `unknown`) => `value is symbol` |
531
+ | `utils.prompt.log` | \{ `error`: (`message`: `string`) => `void`; `info`: (`message`: `string`) => `void`; `message`: (`message`?: `string`, `__namedParameters`?: `LogMessageOptions`) => `void`; `step`: (`message`: `string`) => `void`; `success`: (`message`: `string`) => `void`; `warn`: (`message`: `string`) => `void`; `warning`: (`message`: `string`) => `void`; \} |
532
+ | `utils.prompt.log.error` | (`message`: `string`) => `void` |
533
+ | `utils.prompt.log.info` | (`message`: `string`) => `void` |
534
+ | `utils.prompt.log.message` | (`message`?: `string`, `__namedParameters`?: `LogMessageOptions`) => `void` |
535
+ | `utils.prompt.log.step` | (`message`: `string`) => `void` |
536
+ | `utils.prompt.log.success` | (`message`: `string`) => `void` |
537
+ | `utils.prompt.log.warn` | (`message`: `string`) => `void` |
538
+ | `utils.prompt.log.warning` | (`message`: `string`) => `void` |
539
+ | `utils.prompt.multiselect` | \<`Value`\>(`opts`: `MultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\> |
540
+ | `utils.prompt.note` | (`message`?: `string`, `title`?: `string`) => `void` |
541
+ | `utils.prompt.number` | (`opts`: \{ `defaultValue`: `string`; `errorText`: `string`; `initialValue`: `string`; `message`: `string`; `placeholder`: `string`; `validate`: (`value`: `string`) => `string` \| `void`; \}) => `Promise`\<`number` \| `symbol`\> |
542
+ | `utils.prompt.outro` | (`message`?: `string`) => `void` |
543
+ | `utils.prompt.password` | (`opts`: `PasswordOptions`) => `Promise`\<`string` \| `symbol`\> |
544
+ | `utils.prompt.select` | \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\> |
545
+ | `utils.prompt.selectKey` | \<`Value`\>(`opts`: `SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\> |
546
+ | `utils.prompt.spinner` | () => \{ `message`: (`msg`?: `string`) => `void`; `start`: (`msg`?: `string`) => `void`; `stop`: (`msg`?: `string`, `code`?: `number`) => `void`; \} |
547
+ | `utils.prompt.table` | (`opts`: \{ `opts`: `TableUserConfig`; `type`: `PromptLineMethod`; `value`: `TableData`; \}) => `void` |
548
+ | `utils.prompt.tasks` | (`tasks`: `Task`[]) => `Promise`\<`void`\> |
549
+ | `utils.prompt.text` | (`opts`: `TextOptions`) => `Promise`\<`string` \| `symbol`\> |
550
+ | `utils.style` | *typeof* [`style`](namespaces/style.md) |
551
+
552
+ ### Type Aliases
553
+
554
+ #### CliOpts
555
+
556
+ ```ts
557
+ type CliOpts: {
558
+ args: string[];
559
+ hideBin: boolean;
560
+ };
561
+ ```
562
+
563
+ ##### Type declaration
564
+
565
+ | Name | Type | Description |
566
+ | ------ | ------ | ------ |
567
+ | `args`? | `string`[] | Arguments to pass to the command **Default** `process.argv.slice(2)` |
568
+ | `hideBin`? | `boolean` | Hide the first two arguments **Default** `false` |
569
+
570
+ ***
571
+
572
+ #### Config
573
+
574
+ ```ts
575
+ type Config: {
576
+ cache: boolean;
577
+ hooks: {
578
+ afterPrompt: <D>(data: D) => Response<D | undefined>;
579
+ beforePrompt: <D>(data: D) => Response<D | undefined>;
580
+ };
581
+ intro: (data: HookParams) => Response<void> | false;
582
+ name: string;
583
+ onCancel: (data: HookParams) => Response<void> | false;
584
+ outro: (data: HookParams) => Response<void> | false;
585
+ prompt: OptionsParams;
586
+ updater: boolean;
587
+ version: string;
588
+ };
589
+ ```
590
+
591
+ ##### Type declaration
592
+
593
+ | Name | Type | Description |
594
+ | ------ | ------ | ------ |
595
+ | `cache`? | `boolean` | Use cache **Default** `true` |
596
+ | `hooks`? | \{ `afterPrompt`: \<`D`\>(`data`: `D`) => `Response`\<`D` \| `undefined`\>; `beforePrompt`: \<`D`\>(`data`: `D`) => `Response`\<`D` \| `undefined`\>; \} | hooks for |
597
+ | `hooks.afterPrompt`? | \<`D`\>(`data`: `D`) => `Response`\<`D` \| `undefined`\> | - |
598
+ | `hooks.beforePrompt`? | \<`D`\>(`data`: `D`) => `Response`\<`D` \| `undefined`\> | - |
599
+ | `intro`? | (`data`: `HookParams`) => `Response`\<`void`\> \| `false` | - |
600
+ | `name` | `string` | Set name of you project |
601
+ | `onCancel`? | (`data`: `HookParams`) => `Response`\<`void`\> \| `false` | - |
602
+ | `outro`? | (`data`: `HookParams`) => `Response`\<`void`\> \| `false` | - |
603
+ | `prompt` | `OptionsParams` | Set you prompts config |
604
+ | `updater`? | `boolean` | Use updater **Default** `false` |
605
+ | `version` | `string` | Set version of you current project Used in for the updater notifications. |
606
+
607
+ ***
608
+
609
+ #### CreateOpts
610
+
611
+ ```ts
612
+ type CreateOpts: CliOpts & {
613
+ activeCli: boolean;
614
+ };
615
+ ```
616
+
617
+ ##### Type declaration
618
+
619
+ | Name | Type | Description |
620
+ | ------ | ------ | ------ |
621
+ | `activeCli`? | `boolean` | Options for activate cli. **Default** `true` |
622
+
623
+ ***
624
+
625
+ #### CreateTemplateOpts
626
+
627
+ ```ts
628
+ type CreateTemplateOpts: {
629
+ consts: Record<string, string>;
630
+ input: string;
631
+ install: PkgManager;
632
+ name: string;
633
+ openEditor: TextEditor;
634
+ output: string;
635
+ };
636
+ ```
637
+
638
+ ##### Type declaration
639
+
640
+ | Name | Type | Description |
641
+ | ------ | ------ | ------ |
642
+ | `consts`? | `Record`\<`string`, `string`\> | Add consts to use in your templates. |
643
+ | `input`? | `string` | Set the input path or the template key |
644
+ | `install`? | `PkgManager` | Set the installer |
645
+ | `name`? | `string` | Set the name of the template |
646
+ | `openEditor`? | `TextEditor` | Open editor |
647
+ | `output`? | `string` | Set the output path |
648
+
649
+ ### Variables
650
+
651
+ #### OPTIONS
652
+
653
+ ```ts
654
+ const OPTIONS: {
655
+ array: "array";
656
+ boolean: "boolean";
657
+ install: "install";
658
+ multiselect: "multiselect";
659
+ name: "name";
660
+ number: "number";
661
+ openEditor: "openEditor";
662
+ output: "output";
663
+ path: "path";
664
+ select: "select";
665
+ template: "template";
666
+ text: "text";
667
+ void: "void";
668
+ };
669
+ ```
670
+
671
+ Object of the CREATIUM types
672
+
673
+ ##### Type declaration
674
+
675
+ | Name | Type |
676
+ | ------ | ------ |
677
+ | `array` | `"array"` |
678
+ | `boolean` | `"boolean"` |
679
+ | `install` | `"install"` |
680
+ | `multiselect` | `"multiselect"` |
681
+ | `name` | `"name"` |
682
+ | `number` | `"number"` |
683
+ | `openEditor` | `"openEditor"` |
684
+ | `output` | `"output"` |
685
+ | `path` | `"path"` |
686
+ | `select` | `"select"` |
687
+ | `template` | `"template"` |
688
+ | `text` | `"text"` |
689
+ | `void` | `"void"` |
690
+
691
+ ***
692
+
693
+ #### prompt
694
+
695
+ ```ts
696
+ const prompt: {
697
+ box: (opts: {
698
+ opts: BoxParams[1];
699
+ type: PromptLineMethod;
700
+ value: BoxParams[0];
701
+ }) => void;
702
+ cancel: (message?: string) => void;
703
+ columns: (opts: {
704
+ opts: ColumnsParams[1];
705
+ type: PromptLineMethod;
706
+ value: ColumnsParams[0];
707
+ }) => void;
708
+ confirm: (opts: _clack_prompts.ConfirmOptions) => Promise<boolean | symbol>;
709
+ group: <T>(prompts: _clack_prompts.PromptGroup<T>, opts?: _clack_prompts.PromptGroupOptions<T>) => Promise<{ [P in keyof _clack_prompts.PromptGroupAwaitedReturn<T>]: _clack_prompts.PromptGroupAwaitedReturn<T>[P] }>;
710
+ groupMultiselect: <Value>(opts: _clack_prompts.GroupMultiSelectOptions<Value>) => Promise<symbol | Value[]>;
711
+ intro: (title?: string) => void;
712
+ isCancel: typeof _clack_prompts.isCancel;
713
+ log: {
714
+ error: (message: string) => void;
715
+ info: (message: string) => void;
716
+ message: (message?: string, { symbol }?: _clack_prompts.LogMessageOptions) => void;
717
+ step: (message: string) => void;
718
+ success: (message: string) => void;
719
+ warn: (message: string) => void;
720
+ warning: (message: string) => void;
721
+ };
722
+ multiselect: <Value>(opts: _clack_prompts.MultiSelectOptions<Value>) => Promise<symbol | Value[]>;
723
+ note: (message?: string, title?: string) => void;
724
+ number: typeof number;
725
+ outro: (message?: string) => void;
726
+ password: (opts: _clack_prompts.PasswordOptions) => Promise<string | symbol>;
727
+ select: <Value>(opts: _clack_prompts.SelectOptions<Value>) => Promise<symbol | Value>;
728
+ selectKey: <Value>(opts: _clack_prompts.SelectOptions<Value>) => Promise<symbol | Value>;
729
+ spinner: () => {
730
+ message: (msg?: string) => void;
731
+ start: (msg?: string) => void;
732
+ stop: (msg?: string, code?: number) => void;
733
+ };
734
+ table: (opts: {
735
+ opts: TableParams[1];
736
+ type: PromptLineMethod;
737
+ value: TableParams[0];
738
+ }) => void;
739
+ tasks: (tasks: _clack_prompts.Task[]) => Promise<void>;
740
+ text: (opts: _clack_prompts.TextOptions) => Promise<string | symbol>;
741
+ };
742
+ ```
743
+
744
+ ##### Type declaration
745
+
746
+ | Name | Type |
747
+ | ------ | ------ |
748
+ | `box` | (`opts`: \{ `opts`: `BoxParams`\[`1`\]; `type`: `PromptLineMethod`; `value`: `BoxParams`\[`0`\]; \}) => `void` |
749
+ | `cancel` | (`message`?: `string`) => `void` |
750
+ | `columns` | (`opts`: \{ `opts`: `ColumnsParams`\[`1`\]; `type`: `PromptLineMethod`; `value`: `ColumnsParams`\[`0`\]; \}) => `void` |
751
+ | `confirm` | (`opts`: `_clack_prompts.ConfirmOptions`) => `Promise`\<`boolean` \| `symbol`\> |
752
+ | `group` | \<`T`\>(`prompts`: `_clack_prompts.PromptGroup`\<`T`\>, `opts`?: `_clack_prompts.PromptGroupOptions`\<`T`\>) => `Promise`\<`{ [P in keyof _clack_prompts.PromptGroupAwaitedReturn<T>]: _clack_prompts.PromptGroupAwaitedReturn<T>[P] }`\> |
753
+ | `groupMultiselect` | \<`Value`\>(`opts`: `_clack_prompts.GroupMultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\> |
754
+ | `intro` | (`title`?: `string`) => `void` |
755
+ | `isCancel` | *typeof* `_clack_prompts.isCancel` |
756
+ | `log` | \{ `error`: (`message`: `string`) => `void`; `info`: (`message`: `string`) => `void`; `message`: (`message`?: `string`, `{ symbol }`?: `_clack_prompts.LogMessageOptions`) => `void`; `step`: (`message`: `string`) => `void`; `success`: (`message`: `string`) => `void`; `warn`: (`message`: `string`) => `void`; `warning`: (`message`: `string`) => `void`; \} |
757
+ | `log.error` | (`message`: `string`) => `void` |
758
+ | `log.info` | (`message`: `string`) => `void` |
759
+ | `log.message` | (`message`?: `string`, `{ symbol }`?: `_clack_prompts.LogMessageOptions`) => `void` |
760
+ | `log.step` | (`message`: `string`) => `void` |
761
+ | `log.success` | (`message`: `string`) => `void` |
762
+ | `log.warn` | (`message`: `string`) => `void` |
763
+ | `log.warning` | (`message`: `string`) => `void` |
764
+ | `multiselect` | \<`Value`\>(`opts`: `_clack_prompts.MultiSelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`[]\> |
765
+ | `note` | (`message`?: `string`, `title`?: `string`) => `void` |
766
+ | `number` | *typeof* `number` |
767
+ | `outro` | (`message`?: `string`) => `void` |
768
+ | `password` | (`opts`: `_clack_prompts.PasswordOptions`) => `Promise`\<`string` \| `symbol`\> |
769
+ | `select` | \<`Value`\>(`opts`: `_clack_prompts.SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\> |
770
+ | `selectKey` | \<`Value`\>(`opts`: `_clack_prompts.SelectOptions`\<`Value`\>) => `Promise`\<`symbol` \| `Value`\> |
771
+ | `spinner` | () => \{ `message`: (`msg`?: `string`) => `void`; `start`: (`msg`?: `string`) => `void`; `stop`: (`msg`?: `string`, `code`?: `number`) => `void`; \} |
772
+ | `table` | (`opts`: \{ `opts`: `TableParams`\[`1`\]; `type`: `PromptLineMethod`; `value`: `TableParams`\[`0`\]; \}) => `void` |
773
+ | `tasks` | (`tasks`: `_clack_prompts.Task`[]) => `Promise`\<`void`\> |
774
+ | `text` | (`opts`: `_clack_prompts.TextOptions`) => `Promise`\<`string` \| `symbol`\> |
775
+
776
+ ### Namespaces
777
+
778
+ - [env](namespaces/env.md)
779
+ - [style](namespaces/style.md)
780
+ - [sys](namespaces/sys.md)
781
+
782
+
783
+ ***
784
+
785
+ ## 👨‍💻 Development
786
+
787
+ __creatium__ is an open-source project and its development is open to anyone who wants to participate.
788
+
789
+ [![Issues](https://img.shields.io/badge/Issues-grey?style=for-the-badge)](https://github.com/pigeonposse/creatium/issues)
790
+ [![Pull requests](https://img.shields.io/badge/Pulls-grey?style=for-the-badge)](https://github.com/pigeonposse/creatium/pulls)
791
+ [![Read more](https://img.shields.io/badge/Read%20more-grey?style=for-the-badge)](https://github.com/pigeonposse/creatium)
792
+
793
+ ## ☕ Donate
794
+
795
+ Help us to develop more interesting things.
796
+
797
+ [![Donate](https://img.shields.io/badge/Donate-grey?style=for-the-badge)](https://pigeonposse.com/?popup=donate)
798
+
799
+ ## 📜 License
800
+
801
+ This software is licensed with __[GPL-3.0](https://github.com/pigeonposse/creatium/blob/main/LICENSE)__.
802
+
803
+ [![Read more](https://img.shields.io/badge/Read-more-grey?style=for-the-badge)](https://github.com/pigeonposse/creatium/blob/main/LICENSE)
804
+
805
+ ## 🐦 About us
806
+
807
+ *PigeonPosse* is a ✨ __code development collective__ ✨ focused on creating practical and interesting tools that help developers and users enjoy a more agile and comfortable experience. Our projects cover various programming sectors and we do not have a thematic limitation in terms of projects.
808
+
809
+ [![More](https://img.shields.io/badge/Read-more-grey?style=for-the-badge)](https://github.com/pigeonposse)
810
+
811
+ ***
812
+
813
+ [![Web](https://img.shields.io/badge/Web-grey?style=for-the-badge&logoColor=white)](https://pigeonposse.com)
814
+ [![About Us](https://img.shields.io/badge/About%20Us-grey?style=for-the-badge&logoColor=white)](https://pigeonposse.com?popup=about)
815
+ [![Donate](https://img.shields.io/badge/Donate-pink?style=for-the-badge&logoColor=white)](https://pigeonposse.com/?popup=donate)
816
+ [![Github](https://img.shields.io/badge/Github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/pigeonposse)
817
+ [![Twitter](https://img.shields.io/badge/Twitter-black?style=for-the-badge&logo=twitter&logoColor=white)](https://twitter.com/pigeonposse_)
818
+ [![Instagram](https://img.shields.io/badge/Instagram-black?style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/pigeon.posse/)
819
+ [![Medium](https://img.shields.io/badge/Medium-black?style=for-the-badge&logo=medium&logoColor=white)](https://medium.com/@pigeonposse)
820
+
821
+
822
+ <!--
823
+
824
+ ██████╗ ██╗ ██████╗ ███████╗ ██████╗ ███╗ ██╗██████╗ ██████╗ ███████╗███████╗███████╗
825
+ ██╔══██╗██║██╔════╝ ██╔════╝██╔═══██╗████╗ ██║██╔══██╗██╔═══██╗██╔════╝██╔════╝██╔════╝
826
+ ██████╔╝██║██║ ███╗█████╗ ██║ ██║██╔██╗ ██║██████╔╝██║ ██║███████╗███████╗█████╗
827
+ ██╔═══╝ ██║██║ ██║██╔══╝ ██║ ██║██║╚██╗██║██╔═══╝ ██║ ██║╚════██║╚════██║██╔══╝
828
+ ██║ ██║╚██████╔╝███████╗╚██████╔╝██║ ╚████║██║ ╚██████╔╝███████║███████║███████╗
829
+ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝
830
+
831
+
832
+
833
+ █████╗█████╗█████╗█████╗█████╗█████╗█████╗
834
+ ╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝╚════╝
835
+
836
+
837
+
838
+ ██████╗██████╗ ███████╗ █████╗ ████████╗██╗██╗ ██╗███╗ ███╗
839
+ ██╔════╝██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██║██║ ██║████╗ ████║
840
+ ██║ ██████╔╝█████╗ ███████║ ██║ ██║██║ ██║██╔████╔██║
841
+ ██║ ██╔══██╗██╔══╝ ██╔══██║ ██║ ██║██║ ██║██║╚██╔╝██║
842
+ ╚██████╗██║ ██║███████╗██║ ██║ ██║ ██║╚██████╔╝██║ ╚═╝ ██║
843
+ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
844
+
845
+ Author: Angelo
846
+
847
+ -->
848
+
849
+
850
+
851
+
852
+ <!-- AUTOGEN BY DOVENV - END -->