@apso/cli 0.7.4 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/autogen/index.d.ts +2 -0
  2. package/dist/autogen/index.js +3 -0
  3. package/dist/commands/server/new.d.ts +4 -1
  4. package/dist/commands/server/new.js +115 -22
  5. package/dist/commands/server/scaffold.d.ts +10 -0
  6. package/dist/commands/server/scaffold.js +200 -10
  7. package/dist/lib/api/client.d.ts +65 -0
  8. package/dist/lib/api/client.js +305 -0
  9. package/dist/lib/api/index.d.ts +8 -0
  10. package/dist/lib/api/index.js +22 -0
  11. package/dist/lib/api/services.d.ts +166 -0
  12. package/dist/lib/api/services.js +202 -0
  13. package/dist/lib/api/types.d.ts +212 -0
  14. package/dist/lib/api/types.js +7 -0
  15. package/dist/lib/apsorc-parser.d.ts +3 -0
  16. package/dist/lib/apsorc-parser.js +4 -0
  17. package/dist/lib/config/index.d.ts +8 -0
  18. package/dist/lib/config/index.js +17 -0
  19. package/dist/lib/config/manager.d.ts +127 -0
  20. package/dist/lib/config/manager.js +304 -0
  21. package/dist/lib/config/paths.d.ts +65 -0
  22. package/dist/lib/config/paths.js +127 -0
  23. package/dist/lib/config/types.d.ts +230 -0
  24. package/dist/lib/config/types.js +30 -0
  25. package/dist/lib/generators/base.d.ts +93 -0
  26. package/dist/lib/generators/base.js +90 -0
  27. package/dist/lib/generators/go.d.ts +37 -0
  28. package/dist/lib/generators/go.js +340 -0
  29. package/dist/lib/generators/index.d.ts +21 -0
  30. package/dist/lib/generators/index.js +51 -0
  31. package/dist/lib/generators/python.d.ts +21 -0
  32. package/dist/lib/generators/python.js +253 -0
  33. package/dist/lib/generators/typescript.d.ts +25 -0
  34. package/dist/lib/generators/typescript.js +373 -0
  35. package/dist/lib/index.d.ts +2 -0
  36. package/dist/lib/index.js +9 -1
  37. package/dist/lib/templates/entities/entity-col-timestamp.eta +9 -2
  38. package/dist/lib/templates/entities/entity-col-timestamptz.eta +9 -2
  39. package/dist/lib/templates/entities/entity.eta +18 -5
  40. package/dist/lib/templates/go/dto/dto-col-array.eta +7 -0
  41. package/dist/lib/templates/go/dto/dto-col-boolean.eta +7 -0
  42. package/dist/lib/templates/go/dto/dto-col-date.eta +7 -0
  43. package/dist/lib/templates/go/dto/dto-col-decimal.eta +7 -0
  44. package/dist/lib/templates/go/dto/dto-col-enum.eta +8 -0
  45. package/dist/lib/templates/go/dto/dto-col-float.eta +7 -0
  46. package/dist/lib/templates/go/dto/dto-col-integer.eta +7 -0
  47. package/dist/lib/templates/go/dto/dto-col-json.eta +7 -0
  48. package/dist/lib/templates/go/dto/dto-col-jsonb.eta +7 -0
  49. package/dist/lib/templates/go/dto/dto-col-numeric.eta +7 -0
  50. package/dist/lib/templates/go/dto/dto-col-string.eta +7 -0
  51. package/dist/lib/templates/go/dto/dto-col-text.eta +7 -0
  52. package/dist/lib/templates/go/dto/dto-col-timestamp.eta +7 -0
  53. package/dist/lib/templates/go/dto/dto-col-timestamptz.eta +7 -0
  54. package/dist/lib/templates/go/dto/dto-col-uuid.eta +7 -0
  55. package/dist/lib/templates/go/dto/dto-col-varchar.eta +7 -0
  56. package/dist/lib/templates/go/dto/dto.eta +78 -0
  57. package/dist/lib/templates/go/enums.eta +44 -0
  58. package/dist/lib/templates/go/handlers/handler.eta +212 -0
  59. package/dist/lib/templates/go/header.eta +3 -0
  60. package/dist/lib/templates/go/index-module.eta +53 -0
  61. package/dist/lib/templates/go/middleware/auth.eta +101 -0
  62. package/dist/lib/templates/go/models/model-col-array.eta +1 -0
  63. package/dist/lib/templates/go/models/model-col-boolean.eta +1 -0
  64. package/dist/lib/templates/go/models/model-col-date.eta +1 -0
  65. package/dist/lib/templates/go/models/model-col-decimal.eta +1 -0
  66. package/dist/lib/templates/go/models/model-col-enum.eta +2 -0
  67. package/dist/lib/templates/go/models/model-col-float.eta +1 -0
  68. package/dist/lib/templates/go/models/model-col-integer.eta +1 -0
  69. package/dist/lib/templates/go/models/model-col-json.eta +1 -0
  70. package/dist/lib/templates/go/models/model-col-jsonb.eta +1 -0
  71. package/dist/lib/templates/go/models/model-col-numeric.eta +1 -0
  72. package/dist/lib/templates/go/models/model-col-string.eta +1 -0
  73. package/dist/lib/templates/go/models/model-col-text.eta +1 -0
  74. package/dist/lib/templates/go/models/model-col-timestamp.eta +1 -0
  75. package/dist/lib/templates/go/models/model-col-timestamptz.eta +1 -0
  76. package/dist/lib/templates/go/models/model-col-uuid.eta +1 -0
  77. package/dist/lib/templates/go/models/model-col-varchar.eta +1 -0
  78. package/dist/lib/templates/go/models/model.eta +53 -0
  79. package/dist/lib/templates/go/services/service.eta +190 -0
  80. package/dist/lib/templates/python/enums.eta +10 -0
  81. package/dist/lib/templates/python/header.eta +6 -0
  82. package/dist/lib/templates/python/index-module.eta +18 -0
  83. package/dist/lib/templates/python/models/model-col-array.eta +4 -0
  84. package/dist/lib/templates/python/models/model-col-boolean.eta +5 -0
  85. package/dist/lib/templates/python/models/model-col-date.eta +4 -0
  86. package/dist/lib/templates/python/models/model-col-decimal.eta +4 -0
  87. package/dist/lib/templates/python/models/model-col-enum.eta +16 -0
  88. package/dist/lib/templates/python/models/model-col-float.eta +5 -0
  89. package/dist/lib/templates/python/models/model-col-integer.eta +6 -0
  90. package/dist/lib/templates/python/models/model-col-json.eta +4 -0
  91. package/dist/lib/templates/python/models/model-col-jsonb.eta +4 -0
  92. package/dist/lib/templates/python/models/model-col-numeric.eta +4 -0
  93. package/dist/lib/templates/python/models/model-col-string.eta +6 -0
  94. package/dist/lib/templates/python/models/model-col-text.eta +6 -0
  95. package/dist/lib/templates/python/models/model-col-timestamp.eta +11 -0
  96. package/dist/lib/templates/python/models/model-col-timestamptz.eta +11 -0
  97. package/dist/lib/templates/python/models/model-col-uuid.eta +5 -0
  98. package/dist/lib/templates/python/models/model-col-varchar.eta +6 -0
  99. package/dist/lib/templates/python/models/model.eta +124 -0
  100. package/dist/lib/templates/python/routers/router.eta +206 -0
  101. package/dist/lib/templates/python/schemas/schema-col-array.eta +1 -0
  102. package/dist/lib/templates/python/schemas/schema-col-boolean.eta +1 -0
  103. package/dist/lib/templates/python/schemas/schema-col-date.eta +1 -0
  104. package/dist/lib/templates/python/schemas/schema-col-decimal.eta +1 -0
  105. package/dist/lib/templates/python/schemas/schema-col-enum.eta +6 -0
  106. package/dist/lib/templates/python/schemas/schema-col-float.eta +1 -0
  107. package/dist/lib/templates/python/schemas/schema-col-integer.eta +1 -0
  108. package/dist/lib/templates/python/schemas/schema-col-json.eta +1 -0
  109. package/dist/lib/templates/python/schemas/schema-col-jsonb.eta +1 -0
  110. package/dist/lib/templates/python/schemas/schema-col-numeric.eta +1 -0
  111. package/dist/lib/templates/python/schemas/schema-col-string.eta +1 -0
  112. package/dist/lib/templates/python/schemas/schema-col-text.eta +1 -0
  113. package/dist/lib/templates/python/schemas/schema-col-timestamp.eta +1 -0
  114. package/dist/lib/templates/python/schemas/schema-col-timestamptz.eta +1 -0
  115. package/dist/lib/templates/python/schemas/schema-col-uuid.eta +1 -0
  116. package/dist/lib/templates/python/schemas/schema-col-varchar.eta +1 -0
  117. package/dist/lib/templates/python/schemas/schema.eta +87 -0
  118. package/dist/lib/templates/python/services/service.eta +163 -0
  119. package/dist/lib/templates/rest/controller-rest.eta +13 -12
  120. package/dist/lib/templates/rest/dto-rest.eta +173 -59
  121. package/dist/lib/types/generator.d.ts +241 -0
  122. package/dist/lib/types/generator.js +2 -0
  123. package/dist/lib/types/index.d.ts +1 -0
  124. package/dist/lib/utils/casing.d.ts +1 -0
  125. package/dist/lib/utils/casing.js +11 -1
  126. package/oclif.manifest.json +32 -3
  127. package/package.json +4 -2
  128. package/dist/lib/utils/relationships/parse.spec.d.ts +0 -1
  129. package/dist/lib/utils/relationships/parse.spec.js +0 -402
  130. package/dist/tests/templates/entities/types/array-template.spec.d.ts +0 -1
  131. package/dist/tests/templates/entities/types/array-template.spec.js +0 -82
  132. package/dist/tests/templates/entities/types/bigint-template.spec.d.ts +0 -1
  133. package/dist/tests/templates/entities/types/bigint-template.spec.js +0 -82
  134. package/dist/tests/templates/entities/types/boolean-template.spec.d.ts +0 -1
  135. package/dist/tests/templates/entities/types/boolean-template.spec.js +0 -77
  136. package/dist/tests/templates/entities/types/bytea-template.spec.d.ts +0 -1
  137. package/dist/tests/templates/entities/types/bytea-template.spec.js +0 -68
  138. package/dist/tests/templates/entities/types/char-template.spec.d.ts +0 -1
  139. package/dist/tests/templates/entities/types/char-template.spec.js +0 -68
  140. package/dist/tests/templates/entities/types/date-template.spec.d.ts +0 -1
  141. package/dist/tests/templates/entities/types/date-template.spec.js +0 -56
  142. package/dist/tests/templates/entities/types/decimal-field-validation.spec.d.ts +0 -1
  143. package/dist/tests/templates/entities/types/decimal-field-validation.spec.js +0 -100
  144. package/dist/tests/templates/entities/types/decimal-template.spec.d.ts +0 -1
  145. package/dist/tests/templates/entities/types/decimal-template.spec.js +0 -86
  146. package/dist/tests/templates/entities/types/double-template.spec.d.ts +0 -1
  147. package/dist/tests/templates/entities/types/double-template.spec.js +0 -70
  148. package/dist/tests/templates/entities/types/enum-template.spec.d.ts +0 -1
  149. package/dist/tests/templates/entities/types/enum-template.spec.js +0 -85
  150. package/dist/tests/templates/entities/types/float-template.spec.d.ts +0 -1
  151. package/dist/tests/templates/entities/types/float-template.spec.js +0 -70
  152. package/dist/tests/templates/entities/types/geometry-template.spec.d.ts +0 -1
  153. package/dist/tests/templates/entities/types/geometry-template.spec.js +0 -58
  154. package/dist/tests/templates/entities/types/inet-template.spec.d.ts +0 -1
  155. package/dist/tests/templates/entities/types/inet-template.spec.js +0 -69
  156. package/dist/tests/templates/entities/types/int4range-template.spec.d.ts +0 -1
  157. package/dist/tests/templates/entities/types/int4range-template.spec.js +0 -72
  158. package/dist/tests/templates/entities/types/integer-template.spec.d.ts +0 -1
  159. package/dist/tests/templates/entities/types/integer-template.spec.js +0 -79
  160. package/dist/tests/templates/entities/types/interval-template.spec.d.ts +0 -1
  161. package/dist/tests/templates/entities/types/interval-template.spec.js +0 -68
  162. package/dist/tests/templates/entities/types/json-plain-template.spec.d.ts +0 -1
  163. package/dist/tests/templates/entities/types/json-plain-template.spec.js +0 -54
  164. package/dist/tests/templates/entities/types/json-template.spec.d.ts +0 -1
  165. package/dist/tests/templates/entities/types/json-template.spec.js +0 -40
  166. package/dist/tests/templates/entities/types/jsonb-template.spec.d.ts +0 -1
  167. package/dist/tests/templates/entities/types/jsonb-template.spec.js +0 -40
  168. package/dist/tests/templates/entities/types/money-template.spec.d.ts +0 -1
  169. package/dist/tests/templates/entities/types/money-template.spec.js +0 -68
  170. package/dist/tests/templates/entities/types/numeric-template.spec.d.ts +0 -1
  171. package/dist/tests/templates/entities/types/numeric-template.spec.js +0 -84
  172. package/dist/tests/templates/entities/types/point-template.spec.d.ts +0 -1
  173. package/dist/tests/templates/entities/types/point-template.spec.js +0 -64
  174. package/dist/tests/templates/entities/types/polygon-template.spec.d.ts +0 -1
  175. package/dist/tests/templates/entities/types/polygon-template.spec.js +0 -70
  176. package/dist/tests/templates/entities/types/real-template.spec.d.ts +0 -1
  177. package/dist/tests/templates/entities/types/real-template.spec.js +0 -67
  178. package/dist/tests/templates/entities/types/serial-template.spec.d.ts +0 -1
  179. package/dist/tests/templates/entities/types/serial-template.spec.js +0 -113
  180. package/dist/tests/templates/entities/types/smallint-template.spec.d.ts +0 -1
  181. package/dist/tests/templates/entities/types/smallint-template.spec.js +0 -82
  182. package/dist/tests/templates/entities/types/string-template.spec.d.ts +0 -1
  183. package/dist/tests/templates/entities/types/string-template.spec.js +0 -111
  184. package/dist/tests/templates/entities/types/text-template.spec.d.ts +0 -1
  185. package/dist/tests/templates/entities/types/text-template.spec.js +0 -70
  186. package/dist/tests/templates/entities/types/time-template.spec.d.ts +0 -1
  187. package/dist/tests/templates/entities/types/time-template.spec.js +0 -68
  188. package/dist/tests/templates/entities/types/timestamp-template.spec.d.ts +0 -1
  189. package/dist/tests/templates/entities/types/timestamp-template.spec.js +0 -74
  190. package/dist/tests/templates/entities/types/timetz-template.spec.d.ts +0 -1
  191. package/dist/tests/templates/entities/types/timetz-template.spec.js +0 -68
  192. package/dist/tests/templates/entities/types/tsvector-template.spec.d.ts +0 -1
  193. package/dist/tests/templates/entities/types/tsvector-template.spec.js +0 -55
  194. package/dist/tests/templates/entities/types/uuid-template.spec.d.ts +0 -1
  195. package/dist/tests/templates/entities/types/uuid-template.spec.js +0 -82
  196. package/dist/tests/templates/entities/types/varchar-template.spec.d.ts +0 -1
  197. package/dist/tests/templates/entities/types/varchar-template.spec.js +0 -105
  198. package/dist/tests/templates/entities/types/xml-template.spec.d.ts +0 -1
  199. package/dist/tests/templates/entities/types/xml-template.spec.js +0 -55
  200. package/dist/tests/templates/entities/uuid-entity-template.spec.d.ts +0 -1
  201. package/dist/tests/templates/entities/uuid-entity-template.spec.js +0 -277
  202. package/dist/tests/utils/relationship-deduplication.spec.d.ts +0 -1
  203. package/dist/tests/utils/relationship-deduplication.spec.js +0 -98
@@ -1,6 +1,20 @@
1
1
  <%~ includeFile('./header.eta') %>
2
2
 
3
- import { ApiProperty } from '@nestjs/swagger';
3
+ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
4
+ import {
5
+ IsString,
6
+ IsNumber,
7
+ IsBoolean,
8
+ IsOptional,
9
+ IsNotEmpty,
10
+ IsUUID,
11
+ IsDate,
12
+ IsArray,
13
+ IsEnum,
14
+ IsObject,
15
+ ValidateNested,
16
+ } from 'class-validator';
17
+ import { Type } from 'class-transformer';
4
18
 
5
19
  <% if (it.importEnums) { %>
6
20
  import * as enums from '../../enums';
@@ -8,70 +22,170 @@ import * as enums from '../../enums';
8
22
 
9
23
  export class <%= it.entityName %>Create {
10
24
  <% if (it.addDefaultPKProperty && (it.primaryKeyType === 'uuid' || it.primaryKeyType === 'text')) { %>
25
+ @ApiPropertyOptional()
26
+ @IsOptional()
27
+ @IsUUID()
28
+ id?: string;
29
+
30
+ <% } -%>
31
+ <% it.columns.forEach((field) => { -%>
32
+ <% if (!field.required) { -%>
33
+ @ApiPropertyOptional()
34
+ @IsOptional()
35
+ <% } else { -%>
11
36
  @ApiProperty()
12
- id: string;
13
- <% } %>
14
- <% it.columns.forEach((field) => { %>
15
- @ApiProperty()
16
- <%if (field.dataType.includes("Enum")) {%>
17
- <%= field.name %>: enums.<%= field.dataType %>;
18
- <%} else if (field.type === 'json' || field.type === 'json-plain') {%>
19
- <%= field.name %>: JSON;
20
- <%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
21
- <%= field.name %>: Date;
22
- <%} else if (field.type === 'geometry' || field.type === 'geography') {%>
23
- <%= field.name %>: any;
24
- <%} else if (field.type === 'point') {%>
25
- <%= field.name %>: { x: number, y: number };
26
- <%} else if (field.type === 'linestring' || field.type === 'multipoint') {%>
27
- <%= field.name %>: { coordinates: Array<{ x: number, y: number }> };
28
- <%} else if (field.type === 'polygon' || field.type === 'multilinestring') {%>
29
- <%= field.name %>: { coordinates: Array<Array<{ x: number, y: number }>> };
30
- <%} else if (field.type === 'multipolygon') {%>
31
- <%= field.name %>: { coordinates: Array<Array<Array<{ x: number, y: number }>>> };
32
- <%} else if (field.type === 'geometrycollection') {%>
33
- <%= field.name %>: { geometries: Array<any> };
34
- <%} else {%>
35
- <%= field.name %>: <%= field.dataType %>;
36
- <% } %>
37
- <% }) %>
38
- };
37
+ @IsNotEmpty()
38
+ <% } -%>
39
+ <% if (field.dataType.includes("Enum")) { -%>
40
+ @IsEnum(enums.<%= field.dataType %>)
41
+ <%= field.name %><%= field.required ? '' : '?' %>: enums.<%= field.dataType %>;
42
+
43
+ <% } else if (field.type === 'json' || field.type === 'json-plain') { -%>
44
+ @IsObject()
45
+ <%= field.name %><%= field.required ? '' : '?' %>: Record<string, any>;
46
+
47
+ <% } else if (field.type === 'timestamp' || field.type === 'timestamptz') { -%>
48
+ @IsDate()
49
+ @Type(() => Date)
50
+ <%= field.name %><%= field.required ? '' : '?' %>: Date;
51
+
52
+ <% } else if (field.type === 'uuid') { -%>
53
+ @IsUUID()
54
+ <%= field.name %><%= field.required ? '' : '?' %>: string;
55
+
56
+ <% } else if (field.type === 'geometry' || field.type === 'geography') { -%>
57
+ @IsObject()
58
+ <%= field.name %><%= field.required ? '' : '?' %>: any;
59
+
60
+ <% } else if (field.type === 'point') { -%>
61
+ @IsObject()
62
+ <%= field.name %><%= field.required ? '' : '?' %>: { x: number; y: number };
63
+
64
+ <% } else if (field.type === 'linestring' || field.type === 'multipoint') { -%>
65
+ @IsObject()
66
+ <%= field.name %><%= field.required ? '' : '?' %>: { coordinates: Array<{ x: number; y: number }> };
67
+
68
+ <% } else if (field.type === 'polygon' || field.type === 'multilinestring') { -%>
69
+ @IsObject()
70
+ <%= field.name %><%= field.required ? '' : '?' %>: { coordinates: Array<Array<{ x: number; y: number }>> };
71
+
72
+ <% } else if (field.type === 'multipolygon') { -%>
73
+ @IsObject()
74
+ <%= field.name %><%= field.required ? '' : '?' %>: { coordinates: Array<Array<Array<{ x: number; y: number }>>> };
75
+
76
+ <% } else if (field.type === 'geometrycollection') { -%>
77
+ @IsObject()
78
+ <%= field.name %><%= field.required ? '' : '?' %>: { geometries: Array<any> };
79
+
80
+ <% } else if (field.type === 'array') { -%>
81
+ @IsArray()
82
+ <%= field.name %><%= field.required ? '' : '?' %>: <%= field.dataType %>;
83
+
84
+ <% } else if (field.type === 'boolean') { -%>
85
+ @IsBoolean()
86
+ <%= field.name %><%= field.required ? '' : '?' %>: boolean;
87
+
88
+ <% } else if (field.type === 'integer' || field.type === 'float' || field.type === 'decimal' || field.type === 'numeric') { -%>
89
+ @IsNumber()
90
+ <%= field.name %><%= field.required ? '' : '?' %>: number;
91
+
92
+ <% } else { -%>
93
+ @IsString()
94
+ <%= field.name %><%= field.required ? '' : '?' %>: <%= field.dataType %>;
95
+
96
+ <% } -%>
97
+ <% }) -%>
98
+ }
99
+
100
+ export class <%= it.entityName %>Update {
101
+ <% it.columns.forEach((field) => { -%>
102
+ @ApiPropertyOptional()
103
+ @IsOptional()
104
+ <% if (field.dataType.includes("Enum")) { -%>
105
+ @IsEnum(enums.<%= field.dataType %>)
106
+ <%= field.name %>?: enums.<%= field.dataType %>;
107
+
108
+ <% } else if (field.type === 'json' || field.type === 'json-plain') { -%>
109
+ @IsObject()
110
+ <%= field.name %>?: Record<string, any>;
111
+
112
+ <% } else if (field.type === 'timestamp' || field.type === 'timestamptz') { -%>
113
+ @IsDate()
114
+ @Type(() => Date)
115
+ <%= field.name %>?: Date;
116
+
117
+ <% } else if (field.type === 'uuid') { -%>
118
+ @IsUUID()
119
+ <%= field.name %>?: string;
120
+
121
+ <% } else if (field.type === 'geometry' || field.type === 'geography') { -%>
122
+ @IsObject()
123
+ <%= field.name %>?: any;
124
+
125
+ <% } else if (field.type === 'point') { -%>
126
+ @IsObject()
127
+ <%= field.name %>?: { x: number; y: number };
128
+
129
+ <% } else if (field.type === 'linestring' || field.type === 'multipoint') { -%>
130
+ @IsObject()
131
+ <%= field.name %>?: { coordinates: Array<{ x: number; y: number }> };
132
+
133
+ <% } else if (field.type === 'polygon' || field.type === 'multilinestring') { -%>
134
+ @IsObject()
135
+ <%= field.name %>?: { coordinates: Array<Array<{ x: number; y: number }>> };
136
+
137
+ <% } else if (field.type === 'multipolygon') { -%>
138
+ @IsObject()
139
+ <%= field.name %>?: { coordinates: Array<Array<Array<{ x: number; y: number }>>> };
140
+
141
+ <% } else if (field.type === 'geometrycollection') { -%>
142
+ @IsObject()
143
+ <%= field.name %>?: { geometries: Array<any> };
144
+
145
+ <% } else if (field.type === 'array') { -%>
146
+ @IsArray()
147
+ <%= field.name %>?: <%= field.dataType %>;
148
+
149
+ <% } else if (field.type === 'boolean') { -%>
150
+ @IsBoolean()
151
+ <%= field.name %>?: boolean;
152
+
153
+ <% } else if (field.type === 'integer' || field.type === 'float' || field.type === 'decimal' || field.type === 'numeric') { -%>
154
+ @IsNumber()
155
+ <%= field.name %>?: number;
156
+
157
+ <% } else { -%>
158
+ @IsString()
159
+ <%= field.name %>?: <%= field.dataType %>;
160
+
161
+ <% } -%>
162
+ <% }) -%>
163
+ }
39
164
 
40
165
  export class <%= it.entityName %> {
41
166
  <% if (it.addDefaultPKProperty) { %>
42
167
  @ApiProperty()
43
168
  id: <%= (it.primaryKeyType === 'uuid' || it.primaryKeyType === 'text') ? 'string' : 'number' %>;
44
- <% } %>
45
- <% it.columns.forEach((field) => { %>
169
+
170
+ <% } -%>
171
+ <% it.columns.forEach((field) => { -%>
172
+ <% if (!field.required) { -%>
173
+ @ApiPropertyOptional()
174
+ <%= field.name %>?: <% if (field.dataType.includes("Enum")) { %>enums.<%= field.dataType %><% } else if (field.type === 'json' || field.type === 'json-plain') { %>Record<string, any><% } else if (field.type === 'timestamp' || field.type === 'timestamptz') { %>Date<% } else { %><%= field.dataType %><% } %>;
175
+
176
+ <% } else { -%>
46
177
  @ApiProperty()
47
- <%if (field.dataType.includes("Enum")) {%>
48
- <%= field.name %>: enums.<%= field.dataType %>;
49
- <%} else if (field.type === 'json' || field.type === 'json-plain') {%>
50
- <%= field.name %>: JSON;
51
- <%} else if (field.type === 'timestamp' || field.type === 'timestamptz') {%>
52
- <%= field.name %>: Date;
53
- <%} else if (field.type === 'geometry' || field.type === 'geography') {%>
54
- <%= field.name %>: any;
55
- <%} else if (field.type === 'point') {%>
56
- <%= field.name %>: { x: number, y: number };
57
- <%} else if (field.type === 'linestring' || field.type === 'multipoint') {%>
58
- <%= field.name %>: { coordinates: Array<{ x: number, y: number }> };
59
- <%} else if (field.type === 'polygon' || field.type === 'multilinestring') {%>
60
- <%= field.name %>: { coordinates: Array<Array<{ x: number, y: number }>> };
61
- <%} else if (field.type === 'multipolygon') {%>
62
- <%= field.name %>: { coordinates: Array<Array<Array<{ x: number, y: number }>>> };
63
- <%} else if (field.type === 'geometrycollection') {%>
64
- <%= field.name %>: { geometries: Array<any> };
65
- <%} else {%>
66
- <%= field.name %>: <%= field.dataType %>;
67
- <% } %>
68
- <% }) %>
69
- <% if (it.createdAt) { %>
178
+ <%= field.name %>: <% if (field.dataType.includes("Enum")) { %>enums.<%= field.dataType %><% } else if (field.type === 'json' || field.type === 'json-plain') { %>Record<string, any><% } else if (field.type === 'timestamp' || field.type === 'timestamptz') { %>Date<% } else { %><%= field.dataType %><% } %>;
179
+
180
+ <% } -%>
181
+ <% }) -%>
182
+ <% if (it.createdAt) { -%>
70
183
  @ApiProperty()
71
- created_at: Date;
72
- <% } %>
73
- <% if (it.updatedAt) { %>
184
+ createdAt: Date;
185
+
186
+ <% } -%>
187
+ <% if (it.updatedAt) { -%>
74
188
  @ApiProperty()
75
- updated_at: Date;
76
- <% } %>
77
- };
189
+ updatedAt: Date;
190
+ <% } -%>
191
+ }
@@ -0,0 +1,241 @@
1
+ import { Entity } from "./entity";
2
+ import { AuthConfig } from "./auth";
3
+ import { RelationshipMap, Relationship } from "./relationship";
4
+ /**
5
+ * Supported target languages for code generation
6
+ */
7
+ export type TargetLanguage = "typescript" | "python" | "go";
8
+ /**
9
+ * Represents a file to be generated
10
+ */
11
+ export interface GeneratedFile {
12
+ /**
13
+ * The relative path where the file should be created
14
+ */
15
+ path: string;
16
+ /**
17
+ * The content of the file
18
+ */
19
+ content: string;
20
+ }
21
+ /**
22
+ * Result of validating a configuration for a specific language
23
+ */
24
+ export interface ValidationResult {
25
+ /**
26
+ * Whether the configuration is valid
27
+ */
28
+ valid: boolean;
29
+ /**
30
+ * List of validation errors, if any
31
+ */
32
+ errors: string[];
33
+ /**
34
+ * List of validation warnings (non-fatal issues)
35
+ */
36
+ warnings: string[];
37
+ }
38
+ /**
39
+ * Language-specific configuration options
40
+ */
41
+ export interface PythonLanguageConfig {
42
+ /**
43
+ * Python package name (snake_case)
44
+ */
45
+ packageName?: string;
46
+ /**
47
+ * Whether to use async mode for SQLAlchemy
48
+ */
49
+ asyncMode?: boolean;
50
+ /**
51
+ * Database URL for connection
52
+ */
53
+ databaseUrl?: string;
54
+ }
55
+ export interface GoLanguageConfig {
56
+ /**
57
+ * Go module name (e.g., "github.com/user/project")
58
+ */
59
+ moduleName?: string;
60
+ /**
61
+ * Package name for the main module
62
+ */
63
+ packageName?: string;
64
+ /**
65
+ * Gin mode: "debug" | "release" | "test"
66
+ */
67
+ ginMode?: "debug" | "release" | "test";
68
+ }
69
+ export interface TypeScriptLanguageConfig {
70
+ /**
71
+ * Whether to use strict TypeScript mode
72
+ */
73
+ strictMode?: boolean;
74
+ }
75
+ /**
76
+ * Union type of all language-specific configurations
77
+ */
78
+ export type LanguageConfig = PythonLanguageConfig | GoLanguageConfig | TypeScriptLanguageConfig;
79
+ /**
80
+ * Extended configuration including language settings
81
+ */
82
+ export interface GeneratorConfig {
83
+ /**
84
+ * Target language for code generation
85
+ */
86
+ language: TargetLanguage;
87
+ /**
88
+ * Root folder for source code
89
+ */
90
+ rootFolder: string;
91
+ /**
92
+ * API type: "rest" or "graphql"
93
+ */
94
+ apiType: string;
95
+ /**
96
+ * All entities from the configuration
97
+ */
98
+ entities: Entity[];
99
+ /**
100
+ * Relationship map for all entities
101
+ */
102
+ relationshipMap: RelationshipMap;
103
+ /**
104
+ * Authentication configuration (optional)
105
+ */
106
+ auth?: AuthConfig;
107
+ /**
108
+ * Language-specific configuration options
109
+ */
110
+ languageConfig?: LanguageConfig;
111
+ }
112
+ /**
113
+ * Options for generating an entity
114
+ */
115
+ export interface EntityGenerationOptions {
116
+ /**
117
+ * The entity definition
118
+ */
119
+ entity: Entity;
120
+ /**
121
+ * Relationships for this entity
122
+ */
123
+ relationships: Relationship[];
124
+ /**
125
+ * All entities (for cross-referencing)
126
+ */
127
+ allEntities: Entity[];
128
+ /**
129
+ * API type being generated
130
+ */
131
+ apiType: string;
132
+ }
133
+ /**
134
+ * Options for generating controllers/routers
135
+ */
136
+ export interface ControllerGenerationOptions extends EntityGenerationOptions {
137
+ /**
138
+ * Relationship map for join queries
139
+ */
140
+ relationshipMap: RelationshipMap;
141
+ }
142
+ /**
143
+ * Options for generating services
144
+ */
145
+ export interface ServiceGenerationOptions extends EntityGenerationOptions {
146
+ /**
147
+ * Relationship map for service methods
148
+ */
149
+ relationshipMap: RelationshipMap;
150
+ }
151
+ /**
152
+ * Options for generating DTOs/schemas
153
+ */
154
+ export interface DtoGenerationOptions extends EntityGenerationOptions {
155
+ /**
156
+ * Include validation decorators/rules
157
+ */
158
+ includeValidation?: boolean;
159
+ }
160
+ /**
161
+ * Options for generating migrations
162
+ */
163
+ export interface MigrationGenerationOptions {
164
+ /**
165
+ * All entities to generate migrations for
166
+ */
167
+ entities: Entity[];
168
+ /**
169
+ * Relationship map for foreign keys
170
+ */
171
+ relationshipMap: RelationshipMap;
172
+ /**
173
+ * Migration name/version
174
+ */
175
+ migrationName?: string;
176
+ }
177
+ /**
178
+ * Interface that all language-specific generators must implement
179
+ */
180
+ export interface LanguageGenerator {
181
+ /**
182
+ * Get the target language this generator supports
183
+ */
184
+ getLanguage(): TargetLanguage;
185
+ /**
186
+ * Get the file extension for generated files
187
+ */
188
+ getFileExtension(): string;
189
+ /**
190
+ * Validate the configuration for this language
191
+ */
192
+ validateConfig(config: GeneratorConfig): ValidationResult;
193
+ /**
194
+ * Generate entity/model files
195
+ */
196
+ generateEntity(options: EntityGenerationOptions): Promise<GeneratedFile[]>;
197
+ /**
198
+ * Generate controller/router files
199
+ */
200
+ generateController(options: ControllerGenerationOptions): Promise<GeneratedFile[]>;
201
+ /**
202
+ * Generate service files
203
+ */
204
+ generateService(options: ServiceGenerationOptions): Promise<GeneratedFile[]>;
205
+ /**
206
+ * Generate DTO/schema files
207
+ */
208
+ generateDto(options: DtoGenerationOptions): Promise<GeneratedFile[]>;
209
+ /**
210
+ * Generate module/router registration files
211
+ */
212
+ generateModule(options: EntityGenerationOptions): Promise<GeneratedFile[]>;
213
+ /**
214
+ * Generate migration files
215
+ */
216
+ generateMigration(options: MigrationGenerationOptions): Promise<GeneratedFile[]>;
217
+ /**
218
+ * Generate enum files for all entities
219
+ */
220
+ generateEnums(entities: Entity[], apiType: string): Promise<GeneratedFile[]>;
221
+ /**
222
+ * Generate the index/main module file that ties everything together
223
+ */
224
+ generateIndexModule(entities: Entity[], apiType: string): Promise<GeneratedFile[]>;
225
+ /**
226
+ * Generate guard files (auth, scope, etc.)
227
+ */
228
+ generateGuards(entities: Entity[], auth?: AuthConfig): Promise<GeneratedFile[]>;
229
+ }
230
+ /**
231
+ * Factory function type for creating language generators
232
+ */
233
+ export type GeneratorFactory = (config: GeneratorConfig) => LanguageGenerator;
234
+ /**
235
+ * Registry of available generators by language
236
+ */
237
+ export interface GeneratorRegistry {
238
+ typescript: GeneratorFactory;
239
+ python?: GeneratorFactory;
240
+ go?: GeneratorFactory;
241
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,3 +4,4 @@ export { Index } from "./indices";
4
4
  export { JSONValue } from "./json";
5
5
  export { RelationshipType, Association, ApsorcRelationship, Relationship, RelationshipForTemplate, RelationshipMap, } from "./relationship";
6
6
  export { AuthProviderType, BaseAuthConfig, DbSessionAuthConfig, JwtConfig, JwtClaimsMapping, JwtAuthConfig, ApiKeyAuthConfig, AuthConfig, AuthContext, DB_SESSION_AUTH_DEFAULTS, JWT_AUTH_DEFAULTS, API_KEY_AUTH_DEFAULTS, isDbSessionAuth, isJwtAuth, isApiKeyAuth, } from "./auth";
7
+ export { TargetLanguage, GeneratedFile, ValidationResult, PythonLanguageConfig, GoLanguageConfig, TypeScriptLanguageConfig, LanguageConfig, GeneratorConfig, EntityGenerationOptions, ControllerGenerationOptions, ServiceGenerationOptions, DtoGenerationOptions, MigrationGenerationOptions, LanguageGenerator, GeneratorFactory, GeneratorRegistry, } from "./generator";
@@ -1,3 +1,4 @@
1
1
  export declare function camelCase(str: string): string;
2
2
  export declare const snakeCase: (str: string) => string;
3
3
  export declare function pascalCase(str: string): string;
4
+ export declare function kebabCase(str: string): string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pascalCase = exports.snakeCase = exports.camelCase = void 0;
3
+ exports.kebabCase = exports.pascalCase = exports.snakeCase = exports.camelCase = void 0;
4
4
  function camelCase(str) {
5
5
  return (str
6
6
  // Insert a space before all caps that are followed by lower case (for PascalCase)
@@ -24,3 +24,13 @@ function pascalCase(str) {
24
24
  return c.charAt(0).toUpperCase() + c.slice(1);
25
25
  }
26
26
  exports.pascalCase = pascalCase;
27
+ function kebabCase(str) {
28
+ return str
29
+ // Insert a hyphen before all caps that are followed by lower case (for PascalCase)
30
+ .replace(/([\da-z])([A-Z])/g, "$1-$2")
31
+ // Replace all separators with hyphens
32
+ .replace(/[ _]+/g, "-")
33
+ // Lowercase the entire string
34
+ .toLowerCase();
35
+ }
36
+ exports.kebabCase = kebabCase;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.4",
2
+ "version": "0.8.2",
3
3
  "commands": {
4
4
  "server:new": {
5
5
  "id": "server:new",
@@ -10,7 +10,9 @@
10
10
  "pluginType": "core",
11
11
  "aliases": [],
12
12
  "examples": [
13
- "$ apso server new --name TestProject"
13
+ "$ apso server new --name TestProject",
14
+ "$ apso server new --name TestProject --language python",
15
+ "$ apso server new --name TestProject --language go"
14
16
  ],
15
17
  "flags": {
16
18
  "name": {
@@ -26,6 +28,18 @@
26
28
  "char": "t",
27
29
  "description": "api type (rest or graphql)",
28
30
  "multiple": false
31
+ },
32
+ "language": {
33
+ "name": "language",
34
+ "type": "option",
35
+ "char": "l",
36
+ "description": "target language (typescript, python, go)",
37
+ "multiple": false,
38
+ "options": [
39
+ "typescript",
40
+ "python",
41
+ "go"
42
+ ]
29
43
  }
30
44
  },
31
45
  "args": {
@@ -44,7 +58,10 @@
44
58
  "aliases": [],
45
59
  "examples": [
46
60
  "$ apso server scaffold",
47
- "$ apso server scaffold --skip-format"
61
+ "$ apso server scaffold --skip-format",
62
+ "$ apso server scaffold --language typescript",
63
+ "$ apso server scaffold --language python",
64
+ "$ apso server scaffold --language go"
48
65
  ],
49
66
  "flags": {
50
67
  "help": {
@@ -59,6 +76,18 @@
59
76
  "type": "boolean",
60
77
  "description": "Skip the formatting step (useful when prettier is not available)",
61
78
  "allowNo": false
79
+ },
80
+ "language": {
81
+ "name": "language",
82
+ "type": "option",
83
+ "char": "l",
84
+ "description": "Target language for code generation (typescript, python, go). If not specified, uses .apsorc config or prompts.",
85
+ "multiple": false,
86
+ "options": [
87
+ "typescript",
88
+ "python",
89
+ "go"
90
+ ]
62
91
  }
63
92
  },
64
93
  "args": {}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@apso/cli",
3
- "version": "0.7.4",
3
+ "version": "0.8.2",
4
4
  "description": "Apso CLI",
5
5
  "author": "Apso by Mavric - @mavric",
6
6
  "bin": {
7
- "apso": "./bin/run"
7
+ "apso": "bin/run"
8
8
  },
9
9
  "homepage": "https://github.com/apsoai/cli",
10
10
  "license": "MIT",
@@ -28,6 +28,7 @@
28
28
  "@oclif/plugin-plugins": "^3",
29
29
  "debug": "^4.3.4",
30
30
  "eta": "^2.0.0",
31
+ "inquirer": "^8.2.7",
31
32
  "pluralize": "^8.0.0",
32
33
  "rc": "^1.2.8",
33
34
  "shelljs": "^0.8.5"
@@ -36,6 +37,7 @@
36
37
  "@jest/globals": "^29.5.0",
37
38
  "@oclif/test": "^2.4.7",
38
39
  "@types/chai": "^4",
40
+ "@types/inquirer": "^8.2.12",
39
41
  "@types/mocha": "^10",
40
42
  "@types/node": "^20",
41
43
  "@types/pluralize": "^0.0.29",
@@ -1 +0,0 @@
1
- export {};