@apso/cli 0.0.5 → 0.0.44
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 +313 -53
- package/bin/dev +17 -0
- package/bin/dev.cmd +3 -0
- package/bin/run +3 -3
- package/dist/commands/server/new.d.ts +22 -0
- package/dist/commands/server/new.js +100 -0
- package/dist/commands/server/scaffold.d.ts +14 -0
- package/dist/commands/server/scaffold.js +60 -0
- package/dist/index.d.ts +1 -0
- package/{lib → dist}/index.js +3 -2
- package/dist/lib/apsorc-parser.d.ts +26 -0
- package/dist/lib/apsorc-parser.js +65 -0
- package/dist/lib/base-command.d.ts +4 -0
- package/dist/lib/base-command.js +24 -0
- package/dist/lib/controller.d.ts +2 -0
- package/dist/lib/controller.js +36 -0
- package/dist/lib/dto.d.ts +7 -0
- package/dist/lib/dto.js +49 -0
- package/dist/lib/entity.d.ts +2 -0
- package/dist/lib/entity.js +43 -0
- package/dist/lib/enums.d.ts +6 -0
- package/dist/lib/enums.js +31 -0
- package/dist/lib/gql-dto.d.ts +3 -0
- package/dist/lib/gql-dto.js +43 -0
- package/dist/lib/index-module.d.ts +2 -0
- package/dist/lib/index-module.js +18 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.js +21 -0
- package/dist/lib/module.d.ts +1 -0
- package/dist/lib/module.js +28 -0
- package/dist/lib/service.d.ts +1 -0
- package/dist/lib/service.js +24 -0
- package/dist/lib/templates/entities/entity-col-array.eta +12 -0
- package/dist/lib/templates/entities/entity-col-bigint.eta +11 -0
- package/dist/lib/templates/entities/entity-col-bigserial.eta +12 -0
- package/dist/lib/templates/entities/entity-col-boolean.eta +11 -0
- package/dist/lib/templates/entities/entity-col-bytea.eta +11 -0
- package/dist/lib/templates/entities/entity-col-char.eta +15 -0
- package/dist/lib/templates/entities/entity-col-date.eta +8 -0
- package/dist/lib/templates/entities/entity-col-decimal.eta +11 -0
- package/dist/lib/templates/entities/entity-col-double.eta +11 -0
- package/dist/lib/templates/entities/entity-col-enum.eta +12 -0
- package/dist/lib/templates/entities/entity-col-float.eta +7 -0
- package/dist/lib/templates/entities/entity-col-inet.eta +11 -0
- package/dist/lib/templates/entities/entity-col-int4range.eta +34 -0
- package/dist/lib/templates/entities/entity-col-integer.eta +11 -0
- package/dist/lib/templates/entities/entity-col-interval.eta +11 -0
- package/dist/lib/templates/entities/entity-col-json-plain.eta +8 -0
- package/dist/lib/templates/entities/entity-col-json.eta +5 -0
- package/dist/lib/templates/entities/entity-col-jsonb.eta +5 -0
- package/dist/lib/templates/entities/entity-col-money.eta +11 -0
- package/dist/lib/templates/entities/entity-col-numeric.eta +11 -0
- package/dist/lib/templates/entities/entity-col-point.eta +25 -0
- package/dist/lib/templates/entities/entity-col-real.eta +11 -0
- package/dist/lib/templates/entities/entity-col-serial.eta +12 -0
- package/dist/lib/templates/entities/entity-col-smallint.eta +11 -0
- package/dist/lib/templates/entities/entity-col-smallserial.eta +12 -0
- package/dist/lib/templates/entities/entity-col-string.eta +23 -0
- package/dist/lib/templates/entities/entity-col-text.eta +23 -0
- package/dist/lib/templates/entities/entity-col-time.eta +11 -0
- package/dist/lib/templates/entities/entity-col-timestamp.eta +4 -0
- package/dist/lib/templates/entities/entity-col-timestamptz.eta +4 -0
- package/dist/lib/templates/entities/entity-col-timetz.eta +11 -0
- package/dist/lib/templates/entities/entity-col-tsvector.eta +11 -0
- package/dist/lib/templates/entities/entity-col-uuid.eta +11 -0
- package/dist/lib/templates/entities/entity-col-varchar.eta +18 -0
- package/dist/lib/templates/entities/entity-col-xml.eta +11 -0
- package/dist/lib/templates/entities/entity.eta +116 -0
- package/dist/lib/templates/graphql/dto/dto-col-array.eta +4 -0
- package/dist/lib/templates/graphql/dto/dto-col-boolean.eta +6 -0
- package/dist/lib/templates/graphql/dto/dto-col-date.eta +4 -0
- package/dist/lib/templates/graphql/dto/dto-col-enum.eta +5 -0
- package/dist/lib/templates/graphql/dto/dto-col-float.eta +4 -0
- package/dist/lib/templates/graphql/dto/dto-col-integer.eta +4 -0
- package/dist/lib/templates/graphql/dto/dto-col-json-plain.eta +5 -0
- package/dist/lib/templates/graphql/dto/dto-col-json.eta +5 -0
- package/dist/lib/templates/graphql/dto/dto-col-text.eta +11 -0
- package/dist/lib/templates/graphql/dto/dto-col-timestamp.eta +3 -0
- package/dist/lib/templates/graphql/dto/dto-col-timestamptz.eta +3 -0
- package/dist/lib/templates/graphql/enums-graphql.eta +12 -0
- package/dist/lib/templates/graphql/gql-dto-graphql.eta +67 -0
- package/dist/lib/templates/graphql/index-module-graphql.eta +26 -0
- package/dist/lib/templates/graphql/module-graphql.eta +19 -0
- package/dist/lib/templates/header.eta +3 -0
- package/dist/lib/templates/rest/controller-rest-spec.eta +77 -0
- package/dist/lib/templates/rest/controller-rest.eta +171 -0
- package/dist/lib/templates/rest/dto-rest.eta +48 -0
- package/dist/lib/templates/rest/enums-rest.eta +7 -0
- package/dist/lib/templates/rest/index-module-rest.eta +11 -0
- package/dist/lib/templates/rest/module-rest.eta +16 -0
- package/dist/lib/templates/rest/ormconfig.eta +9 -0
- package/dist/lib/templates/rest/service-rest.eta +25 -0
- package/dist/lib/types/constraints.d.ts +4 -0
- package/dist/lib/types/constraints.js +2 -0
- package/dist/lib/types/entity.d.ts +13 -0
- package/dist/lib/types/entity.js +2 -0
- package/dist/lib/types/field.d.ts +16 -0
- package/dist/lib/types/field.js +2 -0
- package/dist/lib/types/index.d.ts +5 -0
- package/dist/lib/types/index.js +2 -0
- package/dist/lib/types/indices.d.ts +4 -0
- package/dist/lib/types/indices.js +2 -0
- package/dist/lib/types/json.d.ts +3 -0
- package/dist/lib/types/json.js +2 -0
- package/dist/lib/types/relationship.d.ts +43 -0
- package/dist/lib/types/relationship.js +2 -0
- package/dist/lib/utils/casing.d.ts +2 -0
- package/dist/lib/utils/casing.js +16 -0
- package/dist/lib/utils/field.d.ts +6 -0
- package/dist/lib/utils/field.js +65 -0
- package/dist/lib/utils/file-system.d.ts +2 -0
- package/dist/lib/utils/file-system.js +52 -0
- package/dist/lib/utils/relationships/index.d.ts +2 -0
- package/dist/lib/utils/relationships/index.js +11 -0
- package/dist/lib/utils/relationships/parse-v1.d.ts +4 -0
- package/dist/lib/utils/relationships/parse-v1.js +86 -0
- package/dist/lib/utils/relationships/parse.d.ts +11 -0
- package/dist/lib/utils/relationships/parse.js +192 -0
- package/dist/tests/templates/entities/types/array-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/array-template.spec.js +82 -0
- package/dist/tests/templates/entities/types/bigint-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/bigint-template.spec.js +82 -0
- package/dist/tests/templates/entities/types/boolean-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/boolean-template.spec.js +77 -0
- package/dist/tests/templates/entities/types/bytea-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/bytea-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/char-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/char-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/date-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/date-template.spec.js +56 -0
- package/dist/tests/templates/entities/types/decimal-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/decimal-template.spec.js +86 -0
- package/dist/tests/templates/entities/types/double-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/double-template.spec.js +67 -0
- package/dist/tests/templates/entities/types/enum-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/enum-template.spec.js +85 -0
- package/dist/tests/templates/entities/types/float-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/float-template.spec.js +67 -0
- package/dist/tests/templates/entities/types/inet-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/inet-template.spec.js +69 -0
- package/dist/tests/templates/entities/types/int4range-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/int4range-template.spec.js +60 -0
- package/dist/tests/templates/entities/types/integer-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/integer-template.spec.js +79 -0
- package/dist/tests/templates/entities/types/interval-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/interval-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/json-plain-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/json-plain-template.spec.js +54 -0
- package/dist/tests/templates/entities/types/json-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/json-template.spec.js +40 -0
- package/dist/tests/templates/entities/types/jsonb-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/jsonb-template.spec.js +40 -0
- package/dist/tests/templates/entities/types/money-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/money-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/numeric-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/numeric-template.spec.js +84 -0
- package/dist/tests/templates/entities/types/point-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/point-template.spec.js +58 -0
- package/dist/tests/templates/entities/types/real-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/real-template.spec.js +67 -0
- package/dist/tests/templates/entities/types/serial-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/serial-template.spec.js +113 -0
- package/dist/tests/templates/entities/types/smallint-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/smallint-template.spec.js +82 -0
- package/dist/tests/templates/entities/types/string-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/string-template.spec.js +111 -0
- package/dist/tests/templates/entities/types/text-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/text-template.spec.js +70 -0
- package/dist/tests/templates/entities/types/time-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/time-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/timestamp-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/timestamp-template.spec.js +74 -0
- package/dist/tests/templates/entities/types/timetz-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/timetz-template.spec.js +68 -0
- package/dist/tests/templates/entities/types/tsvector-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/tsvector-template.spec.js +55 -0
- package/dist/tests/templates/entities/types/uuid-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/uuid-template.spec.js +82 -0
- package/dist/tests/templates/entities/types/varchar-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/varchar-template.spec.js +102 -0
- package/dist/tests/templates/entities/types/xml-template.spec.d.ts +1 -0
- package/dist/tests/templates/entities/types/xml-template.spec.js +55 -0
- package/dist/tests/templates/entities/utils/template-test-utils.d.ts +31 -0
- package/dist/tests/templates/entities/utils/template-test-utils.js +50 -0
- package/oclif.manifest.json +60 -1
- package/package.json +84 -55
- package/lib/commands/new.d.ts +0 -22
- package/lib/commands/new.js +0 -198
- package/lib/commands/scaffold.d.ts +0 -18
- package/lib/commands/scaffold.js +0 -106
- package/lib/index.d.ts +0 -1
- package/lib/lib/scaffold.d.ts +0 -30
- package/lib/lib/scaffold.js +0 -566
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<%~ includeFile('./header.eta') %>
|
|
2
|
+
|
|
3
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
|
4
|
+
import {<%= it.entityName %>, <%= it.entityName %>Create} from './dtos/<%= it.entityName%>.dto'
|
|
5
|
+
import {<%= it.ctrlName %>} from "./<%= it.entityName %>.controller";
|
|
6
|
+
import {<%= it.svcName %>} from "./<%= it.entityName %>.service";
|
|
7
|
+
import { CrudRequest } from '@nestjsx/crud';
|
|
8
|
+
|
|
9
|
+
const baseRequest: CrudRequest = {
|
|
10
|
+
parsed: {
|
|
11
|
+
fields: [],
|
|
12
|
+
paramsFilter: [],
|
|
13
|
+
search: {},
|
|
14
|
+
filter: [],
|
|
15
|
+
or: [],
|
|
16
|
+
join: [],
|
|
17
|
+
sort: [],
|
|
18
|
+
authPersist: undefined,
|
|
19
|
+
limit: 10,
|
|
20
|
+
offset: 0,
|
|
21
|
+
page: 1,
|
|
22
|
+
cache: undefined,
|
|
23
|
+
},
|
|
24
|
+
options: {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe('<%= it.ctrlName%>', () => {
|
|
28
|
+
let controller: <%= it.ctrlName%>;
|
|
29
|
+
let spyService: <%= it.svcName %>;
|
|
30
|
+
|
|
31
|
+
beforeEach(async () => {
|
|
32
|
+
const ApiServiceProvider = {
|
|
33
|
+
provide: <%= it.svcName %>,
|
|
34
|
+
useFactory: () => ({
|
|
35
|
+
createOne: jest.fn(() => []),
|
|
36
|
+
getOne: jest.fn(() => { }),
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
const module: TestingModule = await Test.createTestingModule({
|
|
40
|
+
controllers: [<%= it.ctrlName%>],
|
|
41
|
+
providers: [<%= it.svcName %>, ApiServiceProvider]
|
|
42
|
+
}).compile();
|
|
43
|
+
|
|
44
|
+
controller = module.get<<%= it.ctrlName%>>(<%= it.ctrlName%>);
|
|
45
|
+
spyService = module.get<<%= it.svcName %>>(<%= it.svcName %>);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should be defined', () => {
|
|
49
|
+
expect(controller).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should call <%= it.ctrlName%> get method', () => {
|
|
53
|
+
const req: CrudRequest = { ...baseRequest }
|
|
54
|
+
expect(controller.get(req)).not.toEqual(null);
|
|
55
|
+
expect(spyService.getOne).toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should call <%= it.ctrlName%> create method', () => {
|
|
59
|
+
const req: CrudRequest = { ...baseRequest }
|
|
60
|
+
|
|
61
|
+
const dto = new <%= it.entityName %>();
|
|
62
|
+
controller.create(req, dto);
|
|
63
|
+
expect(controller.create(req, dto)).not.toEqual(null);
|
|
64
|
+
expect(spyService.createOne).toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Add your tests here
|
|
68
|
+
<% /* getMany(req: CrudRequest): Promise<GetManyDefaultResponse<T> | T[]>;
|
|
69
|
+
getOne(req: CrudRequest): Promise<T>;
|
|
70
|
+
createOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
|
|
71
|
+
createMany(req: CrudRequest, dto: CreateManyDto<DeepPartial<T>>): Promise<T[]>;
|
|
72
|
+
updateOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
|
|
73
|
+
recoverOne(req: CrudRequest): Promise<T>;
|
|
74
|
+
replaceOne(req: CrudRequest, dto: DeepPartial<T>): Promise<T>;
|
|
75
|
+
deleteOne(req: CrudRequest): Promise<void | T>; */ %>
|
|
76
|
+
});
|
|
77
|
+
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<%~ includeFile('./header.eta') %>
|
|
2
|
+
|
|
3
|
+
import { Controller } from "@nestjs/common";
|
|
4
|
+
import { Crud, CrudController, Override, ParsedRequest, CrudRequest, ParsedBody, CreateManyDto } from '@nestjsx/crud';
|
|
5
|
+
import { ApiTags, ApiResponse, ApiOperation, ApiBody } from '@nestjs/swagger';
|
|
6
|
+
import {<%= it.entityName %>, <%= it.entityName %>Create} from './dtos/<%= it.entityName%>.dto'
|
|
7
|
+
import {<%= it.svcName %>} from './<%= it.entityName %>.service';
|
|
8
|
+
|
|
9
|
+
@Crud({
|
|
10
|
+
model: {
|
|
11
|
+
type: <%= it.entityName %>
|
|
12
|
+
},
|
|
13
|
+
dto: {
|
|
14
|
+
create: <%= it.entityName %>Create,
|
|
15
|
+
update: <%= it.entityName %>,
|
|
16
|
+
replace: <%= it.entityName %>,
|
|
17
|
+
},
|
|
18
|
+
query: {
|
|
19
|
+
/**
|
|
20
|
+
* commenting out limit and pagination because of an issue with Crud lib: https://github.com/nestjsx/crud/issues/777
|
|
21
|
+
*/
|
|
22
|
+
// TODO: make limit env driven?
|
|
23
|
+
limit: 5,
|
|
24
|
+
alwaysPaginate: true,
|
|
25
|
+
<% if (it.associations.length) { %>
|
|
26
|
+
join: {
|
|
27
|
+
<% it.associations.forEach((assoc) => { %>
|
|
28
|
+
<% if (assoc.type === 'OneToMany') { %>
|
|
29
|
+
<%= assoc.pluralizedRelationshipName %>: { eager: false },
|
|
30
|
+
<% } else if (assoc.type === 'ManyToOne') { %>
|
|
31
|
+
<%= assoc.relationshipName %>: { eager: false },
|
|
32
|
+
<% } else if (assoc.type === 'ManyToMany') { %>
|
|
33
|
+
<%= assoc.pluralizedRelationshipName %>: { eager: false },
|
|
34
|
+
<% } else if (assoc.type === 'OneToOne') { %>
|
|
35
|
+
<%= assoc.relationshipName %>: { eager: false },
|
|
36
|
+
<% } %>
|
|
37
|
+
<% }) %>
|
|
38
|
+
<% if (it.nestedAssociations.length) {%>
|
|
39
|
+
<% it.nestedAssociations.forEach((assoc) => { %>
|
|
40
|
+
"<%= assoc %>": { eager: false },
|
|
41
|
+
<% }) %>
|
|
42
|
+
<% }%>
|
|
43
|
+
},
|
|
44
|
+
<% } %>
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
@Controller('<%= it.pluralEntityName %>')
|
|
49
|
+
@ApiTags('<%= it.pluralEntityName %>')
|
|
50
|
+
export class <%= it.ctrlName %> implements CrudController<<%= it.entityName %>>{
|
|
51
|
+
constructor(public service: <%= it.svcName %>) {}
|
|
52
|
+
|
|
53
|
+
<% /* https://github.com/nestjsx/crud/wiki/Controllers#routes-override */ %>
|
|
54
|
+
<% /* Override the core controller methods:
|
|
55
|
+
|
|
56
|
+
getManyBase(
|
|
57
|
+
@ParsedRequest() req: CrudRequest,
|
|
58
|
+
): Promise<GetManyDefaultResponse<T> | T[]>;
|
|
59
|
+
|
|
60
|
+
getOneBase(
|
|
61
|
+
@ParsedRequest() req: CrudRequest,
|
|
62
|
+
): Promise<T>;
|
|
63
|
+
|
|
64
|
+
createOneBase(
|
|
65
|
+
@ParsedRequest() req: CrudRequest,
|
|
66
|
+
@ParsedBody() dto: T,
|
|
67
|
+
): Promise<T>;
|
|
68
|
+
|
|
69
|
+
createManyBase(
|
|
70
|
+
@ParsedRequest() req: CrudRequest,
|
|
71
|
+
@ParsedBody() dto: CreateManyDto<T>,
|
|
72
|
+
): Promise<T>;
|
|
73
|
+
|
|
74
|
+
updateOneBase(
|
|
75
|
+
@ParsedRequest() req: CrudRequest,
|
|
76
|
+
@ParsedBody() dto: T,
|
|
77
|
+
): Promise<T>;
|
|
78
|
+
|
|
79
|
+
replaceOneBase(
|
|
80
|
+
@ParsedRequest() req: CrudRequest,
|
|
81
|
+
@ParsedBody() dto: T,
|
|
82
|
+
): Promise<T>;
|
|
83
|
+
|
|
84
|
+
deleteOneBase(
|
|
85
|
+
@ParsedRequest() req: CrudRequest,
|
|
86
|
+
): Promise<void | T>;
|
|
87
|
+
*/ %>
|
|
88
|
+
|
|
89
|
+
get base(): CrudController<<%= it.entityName %>> {
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Override('getManyBase')
|
|
94
|
+
@ApiOperation({ summary: 'Retrieve multiple <%= it.pluralEntityName %>' })
|
|
95
|
+
getMany(
|
|
96
|
+
@ParsedRequest() req: CrudRequest,
|
|
97
|
+
) {
|
|
98
|
+
return this.base.getManyBase(req);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@Override('getOneBase')
|
|
102
|
+
@ApiOperation({ summary: 'Retrieve a single <%= it.entityName %>' })
|
|
103
|
+
get(
|
|
104
|
+
@ParsedRequest() req: CrudRequest,
|
|
105
|
+
) {
|
|
106
|
+
return this.base.getOneBase(req);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@Override('createOneBase')
|
|
110
|
+
@ApiOperation({ summary: 'Create a single <%= it.entityName %>' })
|
|
111
|
+
<% /* @ApiResponse({ status: 200, description: 'description goes here', schema: <%= it.entityName %>Create }) */ %>
|
|
112
|
+
@ApiBody({
|
|
113
|
+
type: <%= it.entityName %>Create ,
|
|
114
|
+
description: "The Description for the Post Body. Please look into the DTO. You will see the @ApiOptionalProperty used to define the Schema.",
|
|
115
|
+
<% /* examples: {
|
|
116
|
+
a: {
|
|
117
|
+
summary: "Empty Body",
|
|
118
|
+
description: "Description for when an empty body is used",
|
|
119
|
+
value: {} as <%= it.entityName %>Create
|
|
120
|
+
},
|
|
121
|
+
b: {
|
|
122
|
+
summary: "Hello Body",
|
|
123
|
+
description: "Hello is used as the greeting",
|
|
124
|
+
value: {greeting: "Hello"} as <%= it.entityName %>Create
|
|
125
|
+
}
|
|
126
|
+
} */ %>
|
|
127
|
+
|
|
128
|
+
})
|
|
129
|
+
create(
|
|
130
|
+
@ParsedRequest() req: CrudRequest,
|
|
131
|
+
@ParsedBody() dto: <%= it.entityName %>,
|
|
132
|
+
) {
|
|
133
|
+
return this.base.createOneBase(req, dto);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@Override('createManyBase')
|
|
137
|
+
@ApiOperation({ summary: 'Create multiple<%= it.pluralEntityName %>' })
|
|
138
|
+
createMany(
|
|
139
|
+
@ParsedRequest() req: CrudRequest,
|
|
140
|
+
@ParsedBody() dto: CreateManyDto<<%= it.entityName %>>
|
|
141
|
+
) {
|
|
142
|
+
return this.base.createManyBase(req, dto);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@Override('updateOneBase')
|
|
146
|
+
@ApiOperation({ summary: 'Update a single <%= it.entityName %>' })
|
|
147
|
+
update(
|
|
148
|
+
@ParsedRequest() req: CrudRequest,
|
|
149
|
+
@ParsedBody() dto: <%= it.entityName %>,
|
|
150
|
+
) {
|
|
151
|
+
return this.base.updateOneBase(req, dto);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@Override('replaceOneBase')
|
|
155
|
+
@ApiOperation({ summary: 'Replace a single <%= it.entityName %>' })
|
|
156
|
+
replace(
|
|
157
|
+
@ParsedRequest() req: CrudRequest,
|
|
158
|
+
@ParsedBody() dto: <%= it.entityName %>,
|
|
159
|
+
) {
|
|
160
|
+
return this.base.replaceOneBase(req, dto);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@Override('deleteOneBase')
|
|
164
|
+
@ApiOperation({ summary: 'Delete a single <%= it.entityName %>' })
|
|
165
|
+
delete(
|
|
166
|
+
@ParsedRequest() req: CrudRequest,
|
|
167
|
+
) {
|
|
168
|
+
return this.base.deleteOneBase(req);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
2
|
+
<%~ includeFile('./header.eta') %>
|
|
3
|
+
|
|
4
|
+
<% if (it.importEnums) { %>
|
|
5
|
+
import * as enums from '../../enums';
|
|
6
|
+
<% } %>
|
|
7
|
+
|
|
8
|
+
export class <%= it.name %>Create {
|
|
9
|
+
<% it.columns.forEach((field) => { %>
|
|
10
|
+
@ApiProperty()
|
|
11
|
+
<%if (field.dataType.includes("Enum")) {%>
|
|
12
|
+
<%= field.name %>: enums.<%= field.dataType %>;
|
|
13
|
+
<%} else if (field.type === 'json' || field.type === 'json-plain') {%>
|
|
14
|
+
<%= field.name %>: JSON;
|
|
15
|
+
<%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
|
|
16
|
+
<%= field.name %>: Date;
|
|
17
|
+
<%} else {%>
|
|
18
|
+
<%= field.name %>: <%= field.dataType %>;
|
|
19
|
+
<% } %>
|
|
20
|
+
<% }) %>
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export class <%= it.name %> {
|
|
24
|
+
<% if (it.addDefaultPKProperty) { %>
|
|
25
|
+
@ApiProperty()
|
|
26
|
+
id: number;
|
|
27
|
+
<% } %>
|
|
28
|
+
<% it.columns.forEach((field) => { %>
|
|
29
|
+
@ApiProperty()
|
|
30
|
+
<%if (field.dataType.includes("Enum")) {%>
|
|
31
|
+
<%= field.name %>: enums.<%= field.dataType %>;
|
|
32
|
+
<%} else if (field.type === 'json' || field.type === 'json-plain') {%>
|
|
33
|
+
<%= field.name %>: JSON;
|
|
34
|
+
<%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
|
|
35
|
+
<%= field.name %>: Date;
|
|
36
|
+
<%} else {%>
|
|
37
|
+
<%= field.name %>: <%= field.dataType %>;
|
|
38
|
+
<% } %>
|
|
39
|
+
<% }) %>
|
|
40
|
+
<% if (it.createdAt) { %>
|
|
41
|
+
@ApiProperty()
|
|
42
|
+
created_at: Date;
|
|
43
|
+
<% } %>
|
|
44
|
+
<% if (it.updatedAt) { %>
|
|
45
|
+
@ApiProperty()
|
|
46
|
+
updated_at: Date;
|
|
47
|
+
<% } %>
|
|
48
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%~ includeFile('./header.eta') %>
|
|
2
|
+
|
|
3
|
+
<% it.entities.forEach((entity) => { %>
|
|
4
|
+
import {<%= entity.name %>Module} from './<%= entity.name %>/<%= entity.name %>.module'
|
|
5
|
+
<%}) %>
|
|
6
|
+
|
|
7
|
+
export default [
|
|
8
|
+
<% it.entities.forEach((entity) => { %>
|
|
9
|
+
<%= entity.name %>Module,
|
|
10
|
+
<%}) %>
|
|
11
|
+
]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%~ includeFile('./header.eta') %>
|
|
2
|
+
|
|
3
|
+
import { Module } from "@nestjs/common";
|
|
4
|
+
import {<%= it.entityName %>} from './<%= it.entityName%>.entity'
|
|
5
|
+
import { TypeOrmModule } from "@nestjs/typeorm";
|
|
6
|
+
import {<%= it.svcName %>} from "./<%= it.entityName %>.service";
|
|
7
|
+
import {<%= it.ctrlName %>} from "./<%= it.entityName %>.controller";
|
|
8
|
+
|
|
9
|
+
@Module({
|
|
10
|
+
imports: [TypeOrmModule.forFeature([<%= it.entityName %>])],
|
|
11
|
+
providers: [<%= it.svcName %>],
|
|
12
|
+
exports: [<%= it.svcName %>],
|
|
13
|
+
controllers: [<%= it.ctrlName %>],
|
|
14
|
+
})
|
|
15
|
+
export class <%= it.modName %> {}
|
|
16
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<%~ includeFile('./header.eta') %>
|
|
2
|
+
|
|
3
|
+
import { Injectable } from "@nestjs/common";
|
|
4
|
+
import { InjectRepository } from "@nestjs/typeorm";
|
|
5
|
+
import { TypeOrmCrudService } from "@nestjsx/crud-typeorm";
|
|
6
|
+
import { QueryOptions } from '@nestjsx/crud';
|
|
7
|
+
import { ParsedRequestParams } from '@nestjsx/crud-request';
|
|
8
|
+
|
|
9
|
+
import {<%= it.entityName %>} from './<%= it.entityName%>.entity'
|
|
10
|
+
|
|
11
|
+
@Injectable()
|
|
12
|
+
export class <%= it.svcName %> extends TypeOrmCrudService<<%= it.entityName %>> {
|
|
13
|
+
constructor(@InjectRepository(<%= it.entityName %>) repo) {
|
|
14
|
+
super(repo);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* Solves https://github.com/nestjsx/crud/issues/777
|
|
20
|
+
*/
|
|
21
|
+
getSelect(query: ParsedRequestParams, options: QueryOptions) {
|
|
22
|
+
return [...new Set(super.getSelect(query, options))]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Unique } from "./constraints";
|
|
2
|
+
import { Field } from "./field";
|
|
3
|
+
import { Index } from "./indices";
|
|
4
|
+
import { Association } from "./relationship";
|
|
5
|
+
export interface Entity {
|
|
6
|
+
name: string;
|
|
7
|
+
created_at?: boolean;
|
|
8
|
+
updated_at?: boolean;
|
|
9
|
+
fields?: Field[];
|
|
10
|
+
indexes?: Index[];
|
|
11
|
+
uniques?: Unique[];
|
|
12
|
+
associations?: Association[];
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type FieldType = "text" | "boolean" | "array" | "enum" | "integer" | "float" | "date" | "json" | "json-plain";
|
|
2
|
+
export interface Field {
|
|
3
|
+
name: string;
|
|
4
|
+
type: FieldType;
|
|
5
|
+
values?: string[];
|
|
6
|
+
nullable?: boolean;
|
|
7
|
+
index?: boolean;
|
|
8
|
+
primary?: boolean;
|
|
9
|
+
unique?: boolean;
|
|
10
|
+
default?: string | null;
|
|
11
|
+
length?: number;
|
|
12
|
+
is_email?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ComputedField extends Field {
|
|
15
|
+
dataType: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { Entity } from "./entity";
|
|
2
|
+
export { FieldType, Field, ComputedField } from "./field";
|
|
3
|
+
export { Index } from "./indices";
|
|
4
|
+
export { JSONValue } from "./json";
|
|
5
|
+
export { RelationshipType, Association, ApsorcRelationship, Relationship, RelationshipForTemplate, RelationshipMap, } from "./relationship";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type RelationshipType = "OneToMany" | "ManyToOne" | "ManyToMany" | "OneToOne";
|
|
2
|
+
export interface ApsorcRelationship {
|
|
3
|
+
from: string;
|
|
4
|
+
to: string;
|
|
5
|
+
type: RelationshipType;
|
|
6
|
+
to_name?: string;
|
|
7
|
+
nullable?: boolean;
|
|
8
|
+
bi_directional?: boolean;
|
|
9
|
+
cascadeDelete?: boolean;
|
|
10
|
+
index?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Relationship {
|
|
13
|
+
name: string;
|
|
14
|
+
type: RelationshipType;
|
|
15
|
+
referenceName?: string | null;
|
|
16
|
+
nullable?: boolean;
|
|
17
|
+
join?: boolean;
|
|
18
|
+
biDirectional?: boolean;
|
|
19
|
+
cascadeDelete?: boolean;
|
|
20
|
+
index?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface RelationshipForTemplate extends Relationship {
|
|
23
|
+
relationshipName: string;
|
|
24
|
+
pluralizedRelationshipName: string;
|
|
25
|
+
pluralizedName: string;
|
|
26
|
+
camelCasedName: string;
|
|
27
|
+
camelCasedId: string;
|
|
28
|
+
entityName: string;
|
|
29
|
+
joinTable: boolean;
|
|
30
|
+
biDirectional: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type RelationshipMap = {
|
|
33
|
+
[key: string]: Relationship[];
|
|
34
|
+
};
|
|
35
|
+
export interface Association {
|
|
36
|
+
name: string;
|
|
37
|
+
type: RelationshipType;
|
|
38
|
+
join_table?: boolean;
|
|
39
|
+
reference_name?: string;
|
|
40
|
+
nested?: boolean;
|
|
41
|
+
nullable?: boolean;
|
|
42
|
+
index?: boolean;
|
|
43
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snakeCase = exports.camelCase = void 0;
|
|
4
|
+
const camelCase = (str, firstUpper) => {
|
|
5
|
+
const firstLetter = firstUpper ? str[0].toUpperCase() : str[0].toLowerCase();
|
|
6
|
+
const restOfLetters = str
|
|
7
|
+
.slice(1)
|
|
8
|
+
.replace(/_[A-Za-z]/g, (underLetter) => underLetter[1].toUpperCase());
|
|
9
|
+
return `${firstLetter}${restOfLetters}`;
|
|
10
|
+
};
|
|
11
|
+
exports.camelCase = camelCase;
|
|
12
|
+
const snakeCase = (str) => str[0].toLowerCase() +
|
|
13
|
+
str
|
|
14
|
+
.slice(1, str.length)
|
|
15
|
+
.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
|
|
16
|
+
exports.snakeCase = snakeCase;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FieldType, Field, ComputedField, Entity } from "../types";
|
|
2
|
+
export declare const getJsTypeFromFieldType: (type: FieldType) => string;
|
|
3
|
+
export declare const getDefaultValueForField: (field: Field) => string | null;
|
|
4
|
+
export declare const getFieldForTemplate: (fields: Field[], entityName: string) => ComputedField[];
|
|
5
|
+
export declare const fieldToEnumType: (fieldName: string, entityName: string) => string;
|
|
6
|
+
export declare const typeExistsInEntity: (entity: Entity, type: string) => number;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.typeExistsInEntity = exports.fieldToEnumType = exports.getFieldForTemplate = exports.getDefaultValueForField = exports.getJsTypeFromFieldType = void 0;
|
|
4
|
+
const casing_1 = require("./casing");
|
|
5
|
+
const getJsTypeFromFieldType = (type) => {
|
|
6
|
+
switch (type) {
|
|
7
|
+
case "array":
|
|
8
|
+
return "string[]";
|
|
9
|
+
case "boolean":
|
|
10
|
+
return "boolean";
|
|
11
|
+
case "integer":
|
|
12
|
+
return "number";
|
|
13
|
+
case "float":
|
|
14
|
+
return "number";
|
|
15
|
+
case "text":
|
|
16
|
+
case "enum":
|
|
17
|
+
default:
|
|
18
|
+
return "string";
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.getJsTypeFromFieldType = getJsTypeFromFieldType;
|
|
22
|
+
const getDefaultValueForField = (field) => {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
switch (field.type) {
|
|
25
|
+
case "enum":
|
|
26
|
+
if (field.default === null) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (typeof field.default !== "undefined") {
|
|
30
|
+
if (!((_a = field.values) === null || _a === void 0 ? void 0 : _a.includes(field.default))) {
|
|
31
|
+
throw new Error(`${field.name}: Invalid default value '${field.default}' (Valid options are: '${(_b = field.values) === null || _b === void 0 ? void 0 : _b.join("', '")}')`);
|
|
32
|
+
}
|
|
33
|
+
return field.default;
|
|
34
|
+
}
|
|
35
|
+
if (typeof field.values !== "undefined") {
|
|
36
|
+
return field.values[0];
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
case "boolean":
|
|
40
|
+
if (typeof field.default !== "undefined") {
|
|
41
|
+
return field.default;
|
|
42
|
+
}
|
|
43
|
+
return "false";
|
|
44
|
+
default:
|
|
45
|
+
if (typeof field.default !== "undefined") {
|
|
46
|
+
return field.default;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.getDefaultValueForField = getDefaultValueForField;
|
|
52
|
+
const getFieldForTemplate = (fields, entityName) => fields.map((field) => ({
|
|
53
|
+
...field,
|
|
54
|
+
default: (0, exports.getDefaultValueForField)(field),
|
|
55
|
+
dataType: field.type === "enum"
|
|
56
|
+
? (0, exports.fieldToEnumType)(field.name, entityName)
|
|
57
|
+
: (0, exports.getJsTypeFromFieldType)(field.type),
|
|
58
|
+
}));
|
|
59
|
+
exports.getFieldForTemplate = getFieldForTemplate;
|
|
60
|
+
const fieldToEnumType = (fieldName, entityName) => `${(0, casing_1.camelCase)(entityName, true)}${(0, casing_1.camelCase)(fieldName, true)}Enum`;
|
|
61
|
+
exports.fieldToEnumType = fieldToEnumType;
|
|
62
|
+
const typeExistsInEntity = (entity, type) => (entity === null || entity === void 0 ? void 0 : entity.fields)
|
|
63
|
+
? entity === null || entity === void 0 ? void 0 : entity.fields.findIndex((field) => field.type === type)
|
|
64
|
+
: -1;
|
|
65
|
+
exports.typeExistsInEntity = typeExistsInEntity;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDirectoryContents = exports.createFile = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
7
|
+
const createDir = (dirname) => {
|
|
8
|
+
if (!fs.existsSync(dirname)) {
|
|
9
|
+
fs.mkdirSync(dirname, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const createFile = (file, content) => {
|
|
13
|
+
const dirname = path.dirname(file);
|
|
14
|
+
createDir(dirname);
|
|
15
|
+
fs.writeFileSync(file, content);
|
|
16
|
+
};
|
|
17
|
+
exports.createFile = createFile;
|
|
18
|
+
const createDirectoryContents = (templatePath, newProjectPath, apiType) => {
|
|
19
|
+
const filesToCreate = fs.readdirSync(templatePath);
|
|
20
|
+
const CURR_DIR = process.cwd();
|
|
21
|
+
filesToCreate.forEach((file) => {
|
|
22
|
+
const origFilePath = `${templatePath}/${file}`;
|
|
23
|
+
// get stats about the current file
|
|
24
|
+
const stats = fs.statSync(origFilePath);
|
|
25
|
+
if (stats.isFile()) {
|
|
26
|
+
writeFile(file, origFilePath, `${CURR_DIR}/${newProjectPath}`, stats.mode, apiType);
|
|
27
|
+
}
|
|
28
|
+
else if (stats.isDirectory()) {
|
|
29
|
+
fs.mkdirSync(`${CURR_DIR}/${newProjectPath}/${file}`);
|
|
30
|
+
// recursive call
|
|
31
|
+
(0, exports.createDirectoryContents)(`${templatePath}/${file}`, `${newProjectPath}/${file}`, apiType);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
exports.createDirectoryContents = createDirectoryContents;
|
|
36
|
+
/* eslint-disable max-params */
|
|
37
|
+
const writeFile = (fileName, origFilePath, writePath, mode, apiType) => {
|
|
38
|
+
const contents = fs.readFileSync(origFilePath, "utf8");
|
|
39
|
+
if (fileName.startsWith("app.module") && fileName.includes(apiType)) {
|
|
40
|
+
fileName = "app.module.ts";
|
|
41
|
+
const fileWritePath = `${writePath}/${fileName}`;
|
|
42
|
+
fs.writeFileSync(fileWritePath, contents, "utf8");
|
|
43
|
+
fs.chmodSync(fileWritePath, mode);
|
|
44
|
+
}
|
|
45
|
+
else if (!fileName.startsWith("app.module")) {
|
|
46
|
+
if (fileName === ".npmignore")
|
|
47
|
+
fileName = ".gitignore";
|
|
48
|
+
const fileWritePath = `${writePath}/${fileName}`;
|
|
49
|
+
fs.writeFileSync(fileWritePath, contents, "utf8");
|
|
50
|
+
fs.chmodSync(fileWritePath, mode);
|
|
51
|
+
}
|
|
52
|
+
};
|