@boostkit/cli 0.0.1
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/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/commands/make/command.d.ts +3 -0
- package/dist/commands/make/command.d.ts.map +1 -0
- package/dist/commands/make/command.js +46 -0
- package/dist/commands/make/command.js.map +1 -0
- package/dist/commands/make/controller.d.ts +3 -0
- package/dist/commands/make/controller.d.ts.map +1 -0
- package/dist/commands/make/controller.js +46 -0
- package/dist/commands/make/controller.js.map +1 -0
- package/dist/commands/make/event.d.ts +3 -0
- package/dist/commands/make/event.d.ts.map +1 -0
- package/dist/commands/make/event.js +32 -0
- package/dist/commands/make/event.js.map +1 -0
- package/dist/commands/make/job.d.ts +3 -0
- package/dist/commands/make/job.d.ts.map +1 -0
- package/dist/commands/make/job.js +41 -0
- package/dist/commands/make/job.js.map +1 -0
- package/dist/commands/make/listener.d.ts +3 -0
- package/dist/commands/make/listener.d.ts.map +1 -0
- package/dist/commands/make/listener.js +34 -0
- package/dist/commands/make/listener.js.map +1 -0
- package/dist/commands/make/mail.d.ts +3 -0
- package/dist/commands/make/mail.d.ts.map +1 -0
- package/dist/commands/make/mail.js +41 -0
- package/dist/commands/make/mail.js.map +1 -0
- package/dist/commands/make/middleware.d.ts +3 -0
- package/dist/commands/make/middleware.d.ts.map +1 -0
- package/dist/commands/make/middleware.js +40 -0
- package/dist/commands/make/middleware.js.map +1 -0
- package/dist/commands/make/model.d.ts +3 -0
- package/dist/commands/make/model.d.ts.map +1 -0
- package/dist/commands/make/model.js +43 -0
- package/dist/commands/make/model.js.map +1 -0
- package/dist/commands/make/provider.d.ts +3 -0
- package/dist/commands/make/provider.d.ts.map +1 -0
- package/dist/commands/make/provider.js +39 -0
- package/dist/commands/make/provider.js.map +1 -0
- package/dist/commands/make/request.d.ts +3 -0
- package/dist/commands/make/request.d.ts.map +1 -0
- package/dist/commands/make/request.js +40 -0
- package/dist/commands/make/request.js.map +1 -0
- package/dist/commands/make.d.ts +3 -0
- package/dist/commands/make.d.ts.map +1 -0
- package/dist/commands/make.js +23 -0
- package/dist/commands/make.js.map +1 -0
- package/dist/commands/module/make.d.ts +3 -0
- package/dist/commands/module/make.d.ts.map +1 -0
- package/dist/commands/module/make.js +190 -0
- package/dist/commands/module/make.js.map +1 -0
- package/dist/commands/module/publish.d.ts +3 -0
- package/dist/commands/module/publish.d.ts.map +1 -0
- package/dist/commands/module/publish.js +117 -0
- package/dist/commands/module/publish.js.map +1 -0
- package/dist/commands/module.d.ts +3 -0
- package/dist/commands/module.d.ts.map +1 -0
- package/dist/commands/module.js +7 -0
- package/dist/commands/module.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 BoostKit
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# @boostkit/cli
|
|
2
|
+
|
|
3
|
+
Forge CLI — code generators, module scaffolding, and artisan command dispatch.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
The CLI is automatically included when you scaffold a project with `create-boostkit-app`. For manual setup:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add -D @boostkit/cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Add to `package.json`:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"scripts": {
|
|
18
|
+
"artisan": "tsx node_modules/@boostkit/cli/src/index.ts"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pnpm artisan --help # List all commands
|
|
27
|
+
pnpm artisan make:controller User # Generate a controller
|
|
28
|
+
pnpm artisan db:seed # Run a user-defined command
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Must be run from a directory containing `bootstrap/app.ts`**. The CLI boots the Forge application (`forge.boot()`) before dispatching commands — all service providers, DI bindings, and database connections are available.
|
|
32
|
+
|
|
33
|
+
## How It Works
|
|
34
|
+
|
|
35
|
+
1. The CLI imports `bootstrap/app.ts` from the current working directory
|
|
36
|
+
2. It calls `forge.boot()` — boots all service providers
|
|
37
|
+
3. Route loaders for `commands` are executed (registers commands from `routes/console.ts`)
|
|
38
|
+
4. The CLI dispatches the matching command with parsed arguments and options
|
|
39
|
+
|
|
40
|
+
## Built-in Commands
|
|
41
|
+
|
|
42
|
+
### `make:*` Generators
|
|
43
|
+
|
|
44
|
+
| Command | Output | Description |
|
|
45
|
+
|---------|--------|-------------|
|
|
46
|
+
| `make:controller <Name>` | `app/Http/Controllers/<Name>Controller.ts` | Decorator-based controller |
|
|
47
|
+
| `make:model <Name>` | `app/Models/<Name>.ts` | ORM Model |
|
|
48
|
+
| `make:job <Name>` | `app/Jobs/<Name>Job.ts` | Queue Job |
|
|
49
|
+
| `make:middleware <Name>` | `app/Http/Middleware/<Name>Middleware.ts` | Middleware class |
|
|
50
|
+
| `make:request <Name>` | `app/Http/Requests/<Name>Request.ts` | FormRequest class |
|
|
51
|
+
| `make:provider <Name>` | `app/Providers/<Name>ServiceProvider.ts` | ServiceProvider |
|
|
52
|
+
| `make:module <Name>` | Full module scaffold | Models, services, providers, controller, Prisma shard |
|
|
53
|
+
|
|
54
|
+
All `make:*` commands support `--force` to overwrite existing files.
|
|
55
|
+
|
|
56
|
+
### `module:*` Commands
|
|
57
|
+
|
|
58
|
+
| Command | Description |
|
|
59
|
+
|---------|-------------|
|
|
60
|
+
| `module:publish` | Merge all `app/**/schema.prisma` shards into `prisma/schema.prisma` |
|
|
61
|
+
|
|
62
|
+
## User-Defined Commands
|
|
63
|
+
|
|
64
|
+
Commands defined in `routes/console.ts` are auto-registered:
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { artisan } from '@boostkit/core'
|
|
68
|
+
|
|
69
|
+
artisan.command('db:seed', async () => {
|
|
70
|
+
await User.create({ name: 'Alice', email: 'alice@example.com' })
|
|
71
|
+
}).description('Seed the database')
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Class-based commands:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import { Command, artisan } from '@boostkit/core'
|
|
78
|
+
|
|
79
|
+
class SeedCommand extends Command {
|
|
80
|
+
readonly signature = 'db:seed {--count=10}'
|
|
81
|
+
readonly description = 'Seed the database'
|
|
82
|
+
|
|
83
|
+
async handle() {
|
|
84
|
+
const count = Number(this.option('count') ?? 10)
|
|
85
|
+
this.info(`Seeding ${count} records...`)
|
|
86
|
+
// ...
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
artisan.register(SeedCommand)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Configuration
|
|
94
|
+
|
|
95
|
+
This package has no runtime config object.
|
|
96
|
+
|
|
97
|
+
## Notes
|
|
98
|
+
|
|
99
|
+
- The CLI must be run from a directory containing `bootstrap/app.ts`
|
|
100
|
+
- Commands are not available at the repo root — always run from the app directory
|
|
101
|
+
- Built with [Commander.js](https://github.com/tj/commander.js) and [cfonts](https://github.com/dominikwilkowski/cfonts) for the banner
|
|
102
|
+
- `--force` flag is supported by all `make:*` generators
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/commands/make/command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6BxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkBrD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { log } from '@clack/prompts';
|
|
5
|
+
function stub(name) {
|
|
6
|
+
// Convert PascalCase to kebab:case for default signature, e.g. SendEmails → send:emails
|
|
7
|
+
const kebab = name
|
|
8
|
+
.replace(/([A-Z])/g, (m, l, i) => (i === 0 ? l : `-${l}`))
|
|
9
|
+
.toLowerCase();
|
|
10
|
+
return `import { Command } from '@boostkit/artisan'
|
|
11
|
+
|
|
12
|
+
export class ${name} extends Command {
|
|
13
|
+
readonly signature = '${kebab} {--force : Force the operation}'
|
|
14
|
+
readonly description = 'Description of ${name}'
|
|
15
|
+
|
|
16
|
+
async handle(): Promise<void> {
|
|
17
|
+
this.info('Running ${name}...')
|
|
18
|
+
|
|
19
|
+
const force = this.option('force')
|
|
20
|
+
if (force) this.comment(' Force flag is set')
|
|
21
|
+
|
|
22
|
+
// TODO: implement
|
|
23
|
+
|
|
24
|
+
this.info('Done.')
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
export function makeCommandCmd(program) {
|
|
30
|
+
program
|
|
31
|
+
.command('make:command <name>')
|
|
32
|
+
.description('Create a new artisan command class')
|
|
33
|
+
.option('-f, --force', 'Overwrite existing file')
|
|
34
|
+
.action(async (name, opts) => {
|
|
35
|
+
const filePath = resolve(process.cwd(), `app/Commands/${name}.ts`);
|
|
36
|
+
if (existsSync(filePath) && !opts.force) {
|
|
37
|
+
log.error(`File already exists: app/Commands/${name}.ts\nUse --force to overwrite.`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
await mkdir(resolve(process.cwd(), 'app/Commands'), { recursive: true });
|
|
41
|
+
await writeFile(filePath, stub(name));
|
|
42
|
+
log.success(`Created app/Commands/${name}.ts`);
|
|
43
|
+
log.info(`Register it in routes/console.ts:\n artisan.register(${name})`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/make/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,SAAS,IAAI,CAAC,IAAY;IACxB,wFAAwF;IACxF,MAAM,KAAK,GAAG,IAAI;SACf,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACzD,WAAW,EAAE,CAAA;IAEhB,OAAO;;eAEM,IAAI;4BACS,KAAK;2CACU,IAAI;;;yBAGtB,IAAI;;;;;;;;;;CAU5B,CAAA;AACD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,aAAa,EAAE,yBAAyB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,IAAI,KAAK,CAAC,CAAA;QAElE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,qCAAqC,IAAI,gCAAgC,CAAC,CAAA;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACxE,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACrC,GAAG,CAAC,OAAO,CAAC,wBAAwB,IAAI,KAAK,CAAC,CAAA;QAC9C,GAAG,CAAC,IAAI,CAAC,yDAAyD,IAAI,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/commands/make/controller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0BxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsBrD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className, prefix) {
|
|
6
|
+
return `import { Controller, Get } from '@boostkit/router'
|
|
7
|
+
import type { Context } from '@boostkit/core'
|
|
8
|
+
|
|
9
|
+
@Controller('${prefix}')
|
|
10
|
+
export class ${className} {
|
|
11
|
+
@Get('/')
|
|
12
|
+
async index(_ctx: Context) {
|
|
13
|
+
return []
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
function derivePrefix(className) {
|
|
19
|
+
const base = className.replace(/Controller$/, '');
|
|
20
|
+
// PascalCase → kebab-case, then pluralise
|
|
21
|
+
const kebab = base
|
|
22
|
+
.replace(/([A-Z])/g, (m, l, i) => (i === 0 ? l : `-${l}`))
|
|
23
|
+
.toLowerCase();
|
|
24
|
+
return `/${kebab}s`;
|
|
25
|
+
}
|
|
26
|
+
export function makeController(program) {
|
|
27
|
+
program
|
|
28
|
+
.command('make:controller <name>')
|
|
29
|
+
.description('Create a new controller class')
|
|
30
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
31
|
+
.action(async (name, opts) => {
|
|
32
|
+
const className = name.endsWith('Controller') ? name : `${name}Controller`;
|
|
33
|
+
const prefix = derivePrefix(className);
|
|
34
|
+
const relPath = `app/Http/Controllers/${className}.ts`;
|
|
35
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
36
|
+
if (existsSync(outPath) && !opts.force) {
|
|
37
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
38
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
42
|
+
await writeFile(outPath, stub(className, prefix));
|
|
43
|
+
console.log(chalk.green(' ✔ Controller created:'), chalk.cyan(relPath));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/commands/make/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB,EAAE,MAAc;IAC7C,OAAO;;;eAGM,MAAM;eACN,SAAS;;;;;;CAMvB,CAAA;AACD,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;IACjD,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI;SACf,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACzD,WAAW,EAAE,CAAA;IAChB,OAAO,IAAI,KAAK,GAAG,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAA;QAC1E,MAAM,MAAM,GAAM,YAAY,CAAC,SAAS,CAAC,CAAA;QACzC,MAAM,OAAO,GAAK,wBAAwB,SAAS,KAAK,CAAA;QACxD,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;QAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/commands/make/event.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYxC,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBhD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `export class ${className} {
|
|
7
|
+
constructor(
|
|
8
|
+
// public readonly userId: string,
|
|
9
|
+
) {}
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
}
|
|
13
|
+
export function makeEvent(program) {
|
|
14
|
+
program
|
|
15
|
+
.command('make:event <name>')
|
|
16
|
+
.description('Create a new event class')
|
|
17
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
18
|
+
.action(async (name, opts) => {
|
|
19
|
+
const className = name;
|
|
20
|
+
const relPath = `app/Events/${className}.ts`;
|
|
21
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
22
|
+
if (existsSync(outPath) && !opts.force) {
|
|
23
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
24
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
28
|
+
await writeFile(outPath, stub(className));
|
|
29
|
+
console.log(chalk.green(' ✔ Event created:'), chalk.cyan(relPath));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/commands/make/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO,gBAAgB,SAAS;;;;;CAKjC,CAAA;AACD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAA;QACtB,MAAM,OAAO,GAAK,cAAc,SAAS,KAAK,CAAA;QAC9C,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/commands/make/job.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBxC,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB9C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `import { Job } from '@boostkit/queue'
|
|
7
|
+
|
|
8
|
+
export class ${className} extends Job {
|
|
9
|
+
static queue = 'default'
|
|
10
|
+
static retries = 3
|
|
11
|
+
|
|
12
|
+
constructor(/* inject payload here */) {
|
|
13
|
+
super()
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async handle(): Promise<void> {
|
|
17
|
+
// TODO: implement job logic
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
export function makeJob(program) {
|
|
23
|
+
program
|
|
24
|
+
.command('make:job <name>')
|
|
25
|
+
.description('Create a new queue job class')
|
|
26
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
27
|
+
.action(async (name, opts) => {
|
|
28
|
+
const className = name;
|
|
29
|
+
const relPath = `app/Jobs/${className}.ts`;
|
|
30
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
31
|
+
if (existsSync(outPath) && !opts.force) {
|
|
32
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
33
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
37
|
+
await writeFile(outPath, stub(className));
|
|
38
|
+
console.log(chalk.green(' ✔ Job created:'), chalk.cyan(relPath));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/commands/make/job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO;;eAEM,SAAS;;;;;;;;;;;;CAYvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAA;QACtB,MAAM,OAAO,GAAK,YAAY,SAAS,KAAK,CAAA;QAC5C,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/commands/make/listener.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBnD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `import type { Listener } from '@boostkit/events'
|
|
7
|
+
|
|
8
|
+
export class ${className} implements Listener {
|
|
9
|
+
async handle(event: unknown): Promise<void> {
|
|
10
|
+
// TODO: implement listener logic
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
}
|
|
15
|
+
export function makeListener(program) {
|
|
16
|
+
program
|
|
17
|
+
.command('make:listener <name>')
|
|
18
|
+
.description('Create a new event listener class')
|
|
19
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
20
|
+
.action(async (name, opts) => {
|
|
21
|
+
const className = name;
|
|
22
|
+
const relPath = `app/Listeners/${className}.ts`;
|
|
23
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
24
|
+
if (existsSync(outPath) && !opts.force) {
|
|
25
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
26
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
30
|
+
await writeFile(outPath, stub(className));
|
|
31
|
+
console.log(chalk.green(' ✔ Listener created:'), chalk.cyan(relPath));
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/commands/make/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO;;eAEM,SAAS;;;;;CAKvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAA;QACtB,MAAM,OAAO,GAAK,iBAAiB,SAAS,KAAK,CAAA;QACjD,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/commands/make/mail.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBxC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqB/C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `import { Mailable } from '@boostkit/mail'
|
|
7
|
+
|
|
8
|
+
export class ${className} extends Mailable {
|
|
9
|
+
constructor(/* inject data here */) {
|
|
10
|
+
super()
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
build(): this {
|
|
14
|
+
return this
|
|
15
|
+
.subject('Your subject here')
|
|
16
|
+
.html('<p>Your HTML content here</p>')
|
|
17
|
+
.text('Your plain text content here')
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
export function makeMail(program) {
|
|
23
|
+
program
|
|
24
|
+
.command('make:mail <name>')
|
|
25
|
+
.description('Create a new mailable class')
|
|
26
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
27
|
+
.action(async (name, opts) => {
|
|
28
|
+
const className = name;
|
|
29
|
+
const relPath = `app/Mail/${className}.ts`;
|
|
30
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
31
|
+
if (existsSync(outPath) && !opts.force) {
|
|
32
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
33
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
37
|
+
await writeFile(outPath, stub(className));
|
|
38
|
+
console.log(chalk.green(' ✔ Mailable created:'), chalk.cyan(relPath));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail.js","sourceRoot":"","sources":["../../../src/commands/make/mail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO;;eAEM,SAAS;;;;;;;;;;;;CAYvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAA;QACtB,MAAM,OAAO,GAAK,YAAY,SAAS,KAAK,CAAA;QAC5C,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/commands/make/middleware.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBrD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `import { Middleware } from '@boostkit/middleware'
|
|
7
|
+
import type { ForgeRequest, ForgeResponse } from '@boostkit/contracts'
|
|
8
|
+
|
|
9
|
+
export class ${className} extends Middleware {
|
|
10
|
+
async handle(
|
|
11
|
+
req: ForgeRequest,
|
|
12
|
+
res: ForgeResponse,
|
|
13
|
+
next: () => Promise<void>
|
|
14
|
+
): Promise<void> {
|
|
15
|
+
// TODO: implement middleware logic
|
|
16
|
+
await next()
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
}
|
|
21
|
+
export function makeMiddleware(program) {
|
|
22
|
+
program
|
|
23
|
+
.command('make:middleware <name>')
|
|
24
|
+
.description('Create a new middleware class')
|
|
25
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
26
|
+
.action(async (name, opts) => {
|
|
27
|
+
const className = name.endsWith('Middleware') ? name : `${name}Middleware`;
|
|
28
|
+
const relPath = `app/Http/Middleware/${className}.ts`;
|
|
29
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
30
|
+
if (existsSync(outPath) && !opts.force) {
|
|
31
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
32
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
36
|
+
await writeFile(outPath, stub(className));
|
|
37
|
+
console.log(chalk.green(' ✔ Middleware created:'), chalk.cyan(relPath));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/commands/make/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO;;;eAGM,SAAS;;;;;;;;;;CAUvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAA;QAC1E,MAAM,OAAO,GAAK,uBAAuB,SAAS,KAAK,CAAA;QACvD,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/commands/make/model.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAyBxC,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsBhD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className, table) {
|
|
6
|
+
return `import { Model } from '@boostkit/orm'
|
|
7
|
+
|
|
8
|
+
export class ${className} extends Model {
|
|
9
|
+
static table = '${table}'
|
|
10
|
+
|
|
11
|
+
static fillable: string[] = []
|
|
12
|
+
|
|
13
|
+
static hidden: string[] = []
|
|
14
|
+
}
|
|
15
|
+
`;
|
|
16
|
+
}
|
|
17
|
+
function deriveTable(className) {
|
|
18
|
+
// PascalCase → snake_case, then pluralise
|
|
19
|
+
return (className
|
|
20
|
+
.replace(/([A-Z])/g, (m, l, i) => (i === 0 ? l : `_${l}`))
|
|
21
|
+
.toLowerCase() + 's');
|
|
22
|
+
}
|
|
23
|
+
export function makeModel(program) {
|
|
24
|
+
program
|
|
25
|
+
.command('make:model <name>')
|
|
26
|
+
.description('Create a new ORM model class')
|
|
27
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
28
|
+
.action(async (name, opts) => {
|
|
29
|
+
const className = name;
|
|
30
|
+
const table = deriveTable(className);
|
|
31
|
+
const relPath = `app/Models/${className}.ts`;
|
|
32
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
33
|
+
if (existsSync(outPath) && !opts.force) {
|
|
34
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
35
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
39
|
+
await writeFile(outPath, stub(className, table));
|
|
40
|
+
console.log(chalk.green(' ✔ Model created:'), chalk.cyan(relPath));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/commands/make/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB,EAAE,KAAa;IAC5C,OAAO;;eAEM,SAAS;oBACJ,KAAK;;;;;;CAMxB,CAAA;AACD,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,0CAA0C;IAC1C,OAAO,CACL,SAAS;SACN,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACzD,WAAW,EAAE,GAAG,GAAG,CACvB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAA;QACtB,MAAM,KAAK,GAAO,WAAW,CAAC,SAAS,CAAC,CAAA;QACxC,MAAM,OAAO,GAAK,cAAc,SAAS,KAAK,CAAA;QAC9C,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;QAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
function stub(className) {
|
|
6
|
+
return `import { ServiceProvider } from '@boostkit/core'
|
|
7
|
+
|
|
8
|
+
export class ${className} extends ServiceProvider {
|
|
9
|
+
register(): void {
|
|
10
|
+
// TODO: bind services into the container
|
|
11
|
+
// this.app.singleton(MyService, () => new MyService())
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async boot(): Promise<void> {
|
|
15
|
+
// TODO: run logic after all providers are registered
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
}
|
|
20
|
+
export function makeProvider(program) {
|
|
21
|
+
program
|
|
22
|
+
.command('make:provider <name>')
|
|
23
|
+
.description('Create a new service provider class')
|
|
24
|
+
.option('-f, --force', 'Overwrite if file already exists')
|
|
25
|
+
.action(async (name, opts) => {
|
|
26
|
+
const className = name.endsWith('ServiceProvider') ? name : `${name}ServiceProvider`;
|
|
27
|
+
const relPath = `app/Providers/${className}.ts`;
|
|
28
|
+
const outPath = resolve(process.cwd(), relPath);
|
|
29
|
+
if (existsSync(outPath) && !opts.force) {
|
|
30
|
+
console.error(chalk.red(` ✗ Already exists: ${relPath}`));
|
|
31
|
+
console.error(chalk.dim(' Use --force to overwrite.'));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
35
|
+
await writeFile(outPath, stub(className));
|
|
36
|
+
console.log(chalk.green(' ✔ Provider created:'), chalk.cyan(relPath));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/commands/make/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,SAAS,IAAI,CAAC,SAAiB;IAC7B,OAAO;;eAEM,SAAS;;;;;;;;;;CAUvB,CAAA;AACD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,aAAa,EAAE,kCAAkC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,iBAAiB,CAAA;QACpF,MAAM,OAAO,GAAK,iBAAiB,SAAS,KAAK,CAAA;QACjD,MAAM,OAAO,GAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAEjD,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAEzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/commands/make/request.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBxC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBlD"}
|