@avleon/cli 0.0.42 → 0.0.43

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 CHANGED
@@ -1,66 +1,66 @@
1
-
2
- ### ⚠️ WARNING: NOT FOR PRODUCTION USE
3
-
4
- > **🚧 This project is in active development.**
5
- >
6
- > It is **not stable** and **not ready** for live environments.
7
- > Use **only for testing, experimentation, or internal evaluation**.
8
- >
9
- > ####❗ Risks of using this in production:
10
- >
11
- > - 🔄 Breaking changes may be introduced at any time
12
- > - 🧪 Features are experimental and may be unstable
13
- > - 🔐 Security has not been audited
14
- > - 💥 Potential for data loss or critical errors
15
- >
16
- > **Please do not deploy this in production environments.**
17
-
18
- # Avleon CLI - v0.0.37
19
-
20
- ### Create Application
21
- ```sh
22
- npx @avleon/cli new my_api
23
- ```
24
- ### Create Controller
25
- ```sh
26
- npx avleon make:controller product
27
- # or shorthand
28
- npx avleon m:c product
29
- # for resource controller with -r flag
30
- npx avleon m:c product -m product -r
31
- ```
32
-
33
- ### Create Model/Entity
34
- ```sh
35
- # basic model
36
- npx avleon make:model product
37
- # typeorm model
38
- npx avleon m:m product --orm
39
- ```
40
-
41
- ### Create Service
42
- ```sh
43
- # basic service
44
- npx avleon make:service product
45
- # resource service with built-in collection
46
- npx avleon make:service product -m product -r
47
- # resource service with typeorm collection
48
- npx avleon make:service product -m product -r --orm
49
- ```
50
-
51
- ### Create Middleware
52
- ```sh
53
- npx avleon make:config product
54
- ```
55
-
56
- ### Create Config
57
- ```sh
58
- npx avleon make:config product
59
- ```
60
-
61
- ### Create authoriztion (Experimental)
62
- ```sh
63
- npx avleon make:auth jwt
64
- ```
65
-
66
-
1
+
2
+ ### ⚠️ WARNING: NOT FOR PRODUCTION USE
3
+
4
+ > **🚧 This project is in active development.**
5
+ >
6
+ > It is **not stable** and **not ready** for live environments.
7
+ > Use **only for testing, experimentation, or internal evaluation**.
8
+ >
9
+ > ####❗ Risks of using this in production:
10
+ >
11
+ > - 🔄 Breaking changes may be introduced at any time
12
+ > - 🧪 Features are experimental and may be unstable
13
+ > - 🔐 Security has not been audited
14
+ > - 💥 Potential for data loss or critical errors
15
+ >
16
+ > **Please do not deploy this in production environments.**
17
+
18
+ # Avleon CLI - v0.0.37
19
+
20
+ ### Create Application
21
+ ```sh
22
+ npx @avleon/cli new my_api
23
+ ```
24
+ ### Create Controller
25
+ ```sh
26
+ npx avleon make:controller product
27
+ # or shorthand
28
+ npx avleon m:c product
29
+ # for resource controller with -r flag
30
+ npx avleon m:c product -m product -r
31
+ ```
32
+
33
+ ### Create Model/Entity
34
+ ```sh
35
+ # basic model
36
+ npx avleon make:model product
37
+ # typeorm model
38
+ npx avleon m:m product --orm
39
+ ```
40
+
41
+ ### Create Service
42
+ ```sh
43
+ # basic service
44
+ npx avleon make:service product
45
+ # resource service with built-in collection
46
+ npx avleon make:service product -m product -r
47
+ # resource service with typeorm collection
48
+ npx avleon make:service product -m product -r --orm
49
+ ```
50
+
51
+ ### Create Middleware
52
+ ```sh
53
+ npx avleon make:config product
54
+ ```
55
+
56
+ ### Create Config
57
+ ```sh
58
+ npx avleon make:config product
59
+ ```
60
+
61
+ ### Create authoriztion (Experimental)
62
+ ```sh
63
+ npx avleon make:auth jwt
64
+ ```
65
+
66
+
@@ -1,11 +1,11 @@
1
- import { Builder, AppConfig } from '@avleon/core';
2
- import { HomeController } from './controllers/home.controller';
3
-
4
- const builder = Builder.createAppBuilder();
5
-
6
- const app = builder.build();
7
- app.useOpenApi((config:AppConfig)=> config.openApi);
8
- app.useControllers([HomeController]);
9
-
10
-
11
- app.run();
1
+ import { Builder, AppConfig } from '@avleon/core';
2
+ import { HomeController } from './controllers/home.controller';
3
+
4
+ const builder = Builder.createAppBuilder();
5
+
6
+ const app = builder.build();
7
+ app.useOpenApi((config:AppConfig)=> config.openApi);
8
+ app.useControllers([HomeController]);
9
+
10
+
11
+ app.run();
@@ -1,17 +1,17 @@
1
- import { Builder, AppConfig } from '@avleon/core';
2
- const builder = Builder.createAppBuilder();
3
-
4
- builder.services.addOpenApi();
5
- builder.services.addServices();
6
- builder.services.addAuthentication();
7
- builder.servicse.addControllers();
8
- const app = builder.build();
9
-
10
-
11
-
12
- if(app.isDevelopment()){
13
- app.useOpenApi((config:AppConfig)=> config.openApi);
14
- }
15
-
16
- app.mapGet('/', () => "Hello World!");
17
- export default app;
1
+ import { Builder, AppConfig } from '@avleon/core';
2
+ const builder = Builder.createAppBuilder();
3
+
4
+ builder.services.addOpenApi();
5
+ builder.services.addServices();
6
+ builder.services.addAuthentication();
7
+ builder.servicse.addControllers();
8
+ const app = builder.build();
9
+
10
+
11
+
12
+ if(app.isDevelopment()){
13
+ app.useOpenApi((config:AppConfig)=> config.openApi);
14
+ }
15
+
16
+ app.mapGet('/', () => "Hello World!");
17
+ export default app;
@@ -1,7 +1,7 @@
1
- import { Get, HttpResponse } from '@avleon/core';
2
- export class {{name}}{
3
- constructor(
4
- private readonly {}
5
- ){}
6
- }
7
-
1
+ import { Get, HttpResponse } from '@avleon/core';
2
+ export class {{name}}{
3
+ constructor(
4
+ private readonly {}
5
+ ){}
6
+ }
7
+
package/stubs/config.stub CHANGED
@@ -1,11 +1,11 @@
1
- @Config
2
- export class OpenApiConfig {
3
- config() {
4
- return {
5
- title: 'My API',
6
- version: '1.0.0',
7
- description: 'API documentation',
8
- path: '/api-docs',
9
- };
10
- }
11
- }
1
+ @Config
2
+ export class OpenApiConfig {
3
+ config() {
4
+ return {
5
+ title: 'My API',
6
+ version: '1.0.0',
7
+ description: 'API documentation',
8
+ path: '/api-docs',
9
+ };
10
+ }
11
+ }
@@ -1,12 +1,12 @@
1
- import { ApiController, Get, HttpResponse } from '@avleon/core';
2
-
3
-
4
- @ApiController('/{controller}s')
5
- export class {Controller}Controller{
6
-
7
- @Get()
8
- index(){
9
- return "{controller} ok";
10
- }
11
-
12
- }
1
+ import { ApiController, Get, HttpResponse } from '@avleon/core';
2
+
3
+
4
+ @ApiController('/{controller}s')
5
+ export class {Controller}Controller{
6
+
7
+ @Get()
8
+ index(){
9
+ return "{controller} ok";
10
+ }
11
+
12
+ }
@@ -1,52 +1,52 @@
1
- import { ApiController, Get, Post, Delete, Param, Query, Body, HttpExceptions } from '@avleon/core';
2
- import { {Model}Service } from '../services/{model}.service';
3
-
4
- @ApiController('/{controller}s')
5
- export class {Controller}Controller{
6
-
7
- constructor(
8
- private readonly {model}Service: {Model}Service
9
- ){}
10
-
11
- @Get()
12
- async index(@Query() query?:any){
13
- if(query && query.page){
14
- const result = await this.{model}Service.paginate(query.page);
15
- return result;
16
- }
17
- const result = await this.{model}Service.findAll();
18
- return result;
19
- }
20
-
21
- @Get('/:id')
22
- async findOne(@Param('id') id:number){
23
- const is{Model} = await this.{model}Service.findByPk(id);
24
- if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
25
- return is{Model};
26
- }
27
-
28
- @Post()
29
- async create(@Body() body:any){
30
- const isSave = await this.{model}Service.create(body);
31
- return isSave;
32
- }
33
-
34
- @Post('/:id')
35
- async update(@Param('id') id:number, updateBody:any){
36
- const is{Model} = await this.{model}Service.findByPk(id);
37
- if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
38
- const isUpdated = await this.{model}Service.update(id,updateBody);
39
- if(!isUpdated) throw HttpExceptions.internalError("Can't update {Model}");
40
- return "Updated Successfully";
41
- }
42
-
43
- @Delete('/:id')
44
- async delete(@Param('id') id:number){
45
- const is{Model} = await this.{model}Service.findByPk(id);
46
- if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
47
- const isDeleted = await this.{model}Service.delete(id);
48
- if(!isDeleted) throw HttpExceptions.internalError("Can't delete");
49
- return "Deleted Successfully";
50
- }
51
-
52
- }
1
+ import { ApiController, Get, Post, Delete, Param, Query, Body, HttpExceptions } from '@avleon/core';
2
+ import { {Model}Service } from '../services/{model}.service';
3
+
4
+ @ApiController('/{controller}s')
5
+ export class {Controller}Controller{
6
+
7
+ constructor(
8
+ private readonly {model}Service: {Model}Service
9
+ ){}
10
+
11
+ @Get()
12
+ async index(@Query() query?:any){
13
+ if(query && query.page){
14
+ const result = await this.{model}Service.paginate(query.page);
15
+ return result;
16
+ }
17
+ const result = await this.{model}Service.findAll();
18
+ return result;
19
+ }
20
+
21
+ @Get('/:id')
22
+ async findOne(@Param('id') id:number){
23
+ const is{Model} = await this.{model}Service.findByPk(id);
24
+ if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
25
+ return is{Model};
26
+ }
27
+
28
+ @Post()
29
+ async create(@Body() body:any){
30
+ const isSave = await this.{model}Service.create(body);
31
+ return isSave;
32
+ }
33
+
34
+ @Post('/:id')
35
+ async update(@Param('id') id:number, updateBody:any){
36
+ const is{Model} = await this.{model}Service.findByPk(id);
37
+ if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
38
+ const isUpdated = await this.{model}Service.update(id,updateBody);
39
+ if(!isUpdated) throw HttpExceptions.internalError("Can't update {Model}");
40
+ return "Updated Successfully";
41
+ }
42
+
43
+ @Delete('/:id')
44
+ async delete(@Param('id') id:number){
45
+ const is{Model} = await this.{model}Service.findByPk(id);
46
+ if(!is{Model}) throw HttpExceptions.notFound("{Model} not found.");
47
+ const isDeleted = await this.{model}Service.delete(id);
48
+ if(!isDeleted) throw HttpExceptions.internalError("Can't delete");
49
+ return "Deleted Successfully";
50
+ }
51
+
52
+ }
@@ -1,34 +1,34 @@
1
- import { ApiController, Get, Post, Delete, Param, Query, Body, HttpExceptions } from '@avleon/core';
2
-
3
- @ApiController('/{controller}s')
4
- export class {Controller}Controller{
5
-
6
-
7
-
8
- @Get()
9
- async index(@Query() query?:any){
10
- throw new Error("Method not implemented.");
11
- }
12
-
13
- @Get('/:id')
14
- async findOne(@Param('id') id:number){
15
- throw new Error("Method not implemented.");
16
- }
17
-
18
- @Post()
19
- async create(@Body() body:any){
20
- throw new Error("Method not implemented.");
21
- }
22
-
23
- @Post('/:id')
24
- async update(@Param('id') id:number, updateBody:any){
25
-
26
- throw new Error("Method not implemented.");
27
- }
28
-
29
- @Delete('/:id')
30
- async delete(@Param('id') id:number){
31
- throw new Error("Method not implemented.");
32
- }
33
-
34
- }
1
+ import { ApiController, Get, Post, Delete, Param, Query, Body, HttpExceptions } from '@avleon/core';
2
+
3
+ @ApiController('/{controller}s')
4
+ export class {Controller}Controller{
5
+
6
+
7
+
8
+ @Get()
9
+ async index(@Query() query?:any){
10
+ throw new Error("Method not implemented.");
11
+ }
12
+
13
+ @Get('/:id')
14
+ async findOne(@Param('id') id:number){
15
+ throw new Error("Method not implemented.");
16
+ }
17
+
18
+ @Post()
19
+ async create(@Body() body:any){
20
+ throw new Error("Method not implemented.");
21
+ }
22
+
23
+ @Post('/:id')
24
+ async update(@Param('id') id:number, updateBody:any){
25
+
26
+ throw new Error("Method not implemented.");
27
+ }
28
+
29
+ @Delete('/:id')
30
+ async delete(@Param('id') id:number){
31
+ throw new Error("Method not implemented.");
32
+ }
33
+
34
+ }
@@ -1,6 +1,6 @@
1
-
2
-
3
- export class {Model}{
4
- id: number;
5
- name: string;
6
- }
1
+
2
+
3
+ export class {Model}{
4
+ id: number;
5
+ name: string;
6
+ }
@@ -1,23 +1,23 @@
1
-
2
- import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn} from 'typeorm';
3
-
4
- @Entity({name:"{Model}"})
5
- export class {Model}{
6
-
7
- @PrimaryGeneratedColumn()
8
- id:number;
9
-
10
-
11
- // your fields
12
-
13
- // @Column()
14
- // name:string
15
-
16
-
17
- @CreateDateColumn()
18
- createdAt: Date;
19
-
20
-
21
- @UpdateDateColumn()
22
- updatedAt: Date;
23
- }
1
+
2
+ import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn} from 'typeorm';
3
+
4
+ @Entity({name:"{Model}"})
5
+ export class {Model}{
6
+
7
+ @PrimaryGeneratedColumn()
8
+ id:number;
9
+
10
+
11
+ // your fields
12
+
13
+ // @Column()
14
+ // name:string
15
+
16
+
17
+ @CreateDateColumn()
18
+ createdAt: Date;
19
+
20
+
21
+ @UpdateDateColumn()
22
+ updatedAt: Date;
23
+ }
package/stubs/serve.stub CHANGED
@@ -1,10 +1,10 @@
1
- import { Environment, inject } from "@avleon/core";
2
- import app from "./app";
3
-
4
- async function serve() {
5
- const env = inject(Environment);
6
- const port = env.get<number>("PORT") || 4000;
7
- await app.run(port);
8
- }
9
-
10
- serve();
1
+ import { Environment, inject } from "@avleon/core";
2
+ import app from "./app";
3
+
4
+ async function serve() {
5
+ const env = inject(Environment);
6
+ const port = env.get<number>("PORT") || 4000;
7
+ await app.run(port);
8
+ }
9
+
10
+ serve();
@@ -1,8 +1,8 @@
1
-
2
- @AppService
3
- export class {Service} {
4
-
5
- sayHello(){
6
- return "Hello World!";
7
- }
8
- }
1
+
2
+ @AppService
3
+ export class {Service} {
4
+
5
+ sayHello(){
6
+ return "Hello World!";
7
+ }
8
+ }
@@ -1,73 +1,73 @@
1
- import { AppService, InjectRepository } from '@avleon/core';
2
- import { Repository } from 'typeorm';
3
- import { {Model} } from '../models/{model}.model';
4
-
5
-
6
- @AppService
7
- export class {Service}Service{
8
-
9
- constructor(
10
- @InjectRepository({Model})
11
- private readonly {model}Repository:Repository<{Model}>
12
- ){}
13
-
14
- async findAll(options:any={}){
15
- return this.{model}Repository.find(options);
16
- }
17
-
18
- async paginate(current:number = 1, options:any={}){
19
- const take = 10;
20
- const skip = current > 1 ? ( current -1 ) * 10 : 0;
21
- const total = await this.{model}Repository.count(options);
22
- const totalPage = Math.ceil(total / take);
23
- const next = current < totalPage ? current + 1 : null;
24
- const prev = current > 1 ? current - 1 : null;
25
- const data = await this.{model}Repository.find({
26
- ...options,
27
- take,
28
- skip
29
- })
30
-
31
- return {
32
- total,
33
- totalPage,
34
- current,
35
- next,
36
- prev,
37
- data
38
- };
39
- }
40
-
41
- async findByPk(id:number){
42
- return this.{model}Repository.findOne({id});
43
- }
44
-
45
- async findBy(options:any){
46
- return this.{model}Repository.findBy(options);
47
- }
48
-
49
- async findOneBy(options:any){
50
- return this.{model}Repository.findOneBy(options);
51
- }
52
-
53
-
54
- async findOne(id:number){
55
- return this.{model}Repository.findOne({where:{id}}) ;
56
- }
57
-
58
- async create(createBody:any){
59
- const newItem = this.{model}Repository.create();
60
- return await this.{model}Repository.save();
61
- }
62
-
63
- async update(id:number, updateBody:any){
64
- const isUpdate = await this.{model}Repository.update({id}, updateBody);
65
- return isUpdate.affected > 0;
66
- }
67
-
68
- async delete(id:number){
69
- const isDeleted = await this.{model}Repository.delete({id});
70
- return isDeleted.affected > 0;
71
- }
72
-
73
- }
1
+ import { AppService, InjectRepository } from '@avleon/core';
2
+ import { Repository } from 'typeorm';
3
+ import { {Model} } from '../models/{model}.model';
4
+
5
+
6
+ @AppService
7
+ export class {Service}Service{
8
+
9
+ constructor(
10
+ @InjectRepository({Model})
11
+ private readonly {model}Repository:Repository<{Model}>
12
+ ){}
13
+
14
+ async findAll(options:any={}){
15
+ return this.{model}Repository.find(options);
16
+ }
17
+
18
+ async paginate(current:number = 1, options:any={}){
19
+ const take = 10;
20
+ const skip = current > 1 ? ( current -1 ) * 10 : 0;
21
+ const total = await this.{model}Repository.count(options);
22
+ const totalPage = Math.ceil(total / take);
23
+ const next = current < totalPage ? current + 1 : null;
24
+ const prev = current > 1 ? current - 1 : null;
25
+ const data = await this.{model}Repository.find({
26
+ ...options,
27
+ take,
28
+ skip
29
+ })
30
+
31
+ return {
32
+ total,
33
+ totalPage,
34
+ current,
35
+ next,
36
+ prev,
37
+ data
38
+ };
39
+ }
40
+
41
+ async findByPk(id:number){
42
+ return this.{model}Repository.findOne({id});
43
+ }
44
+
45
+ async findBy(options:any){
46
+ return this.{model}Repository.findBy(options);
47
+ }
48
+
49
+ async findOneBy(options:any){
50
+ return this.{model}Repository.findOneBy(options);
51
+ }
52
+
53
+
54
+ async findOne(id:number){
55
+ return this.{model}Repository.findOne({where:{id}}) ;
56
+ }
57
+
58
+ async create(createBody:any){
59
+ const newItem = this.{model}Repository.create();
60
+ return await this.{model}Repository.save();
61
+ }
62
+
63
+ async update(id:number, updateBody:any){
64
+ const isUpdate = await this.{model}Repository.update({id}, updateBody);
65
+ return isUpdate.affected > 0;
66
+ }
67
+
68
+ async delete(id:number){
69
+ const isDeleted = await this.{model}Repository.delete({id});
70
+ return isDeleted.affected > 0;
71
+ }
72
+
73
+ }