@apso/cli 0.0.4 → 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.
Files changed (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +313 -53
  3. package/bin/dev +17 -0
  4. package/bin/dev.cmd +3 -0
  5. package/bin/run +3 -3
  6. package/dist/commands/server/new.d.ts +22 -0
  7. package/dist/commands/server/new.js +105 -0
  8. package/dist/commands/server/scaffold.d.ts +14 -0
  9. package/dist/commands/server/scaffold.js +60 -0
  10. package/dist/index.d.ts +1 -0
  11. package/{lib → dist}/index.js +3 -2
  12. package/dist/lib/apsorc-parser.d.ts +26 -0
  13. package/dist/lib/apsorc-parser.js +65 -0
  14. package/dist/lib/base-command.d.ts +4 -0
  15. package/dist/lib/base-command.js +24 -0
  16. package/dist/lib/controller.d.ts +2 -0
  17. package/dist/lib/controller.js +36 -0
  18. package/dist/lib/dto.d.ts +7 -0
  19. package/dist/lib/dto.js +49 -0
  20. package/dist/lib/entity.d.ts +2 -0
  21. package/dist/lib/entity.js +43 -0
  22. package/dist/lib/enums.d.ts +6 -0
  23. package/dist/lib/enums.js +31 -0
  24. package/dist/lib/gql-dto.d.ts +3 -0
  25. package/dist/lib/gql-dto.js +43 -0
  26. package/dist/lib/index-module.d.ts +2 -0
  27. package/dist/lib/index-module.js +18 -0
  28. package/dist/lib/index.d.ts +10 -0
  29. package/dist/lib/index.js +21 -0
  30. package/dist/lib/module.d.ts +1 -0
  31. package/dist/lib/module.js +28 -0
  32. package/dist/lib/service.d.ts +1 -0
  33. package/dist/lib/service.js +24 -0
  34. package/dist/lib/templates/entities/entity-col-array.eta +12 -0
  35. package/dist/lib/templates/entities/entity-col-bigint.eta +11 -0
  36. package/dist/lib/templates/entities/entity-col-bigserial.eta +12 -0
  37. package/dist/lib/templates/entities/entity-col-boolean.eta +11 -0
  38. package/dist/lib/templates/entities/entity-col-bytea.eta +11 -0
  39. package/dist/lib/templates/entities/entity-col-char.eta +15 -0
  40. package/dist/lib/templates/entities/entity-col-date.eta +8 -0
  41. package/dist/lib/templates/entities/entity-col-decimal.eta +11 -0
  42. package/dist/lib/templates/entities/entity-col-double.eta +11 -0
  43. package/dist/lib/templates/entities/entity-col-enum.eta +12 -0
  44. package/dist/lib/templates/entities/entity-col-float.eta +7 -0
  45. package/dist/lib/templates/entities/entity-col-inet.eta +11 -0
  46. package/dist/lib/templates/entities/entity-col-int4range.eta +34 -0
  47. package/dist/lib/templates/entities/entity-col-integer.eta +11 -0
  48. package/dist/lib/templates/entities/entity-col-interval.eta +11 -0
  49. package/dist/lib/templates/entities/entity-col-json-plain.eta +8 -0
  50. package/dist/lib/templates/entities/entity-col-json.eta +5 -0
  51. package/dist/lib/templates/entities/entity-col-jsonb.eta +5 -0
  52. package/dist/lib/templates/entities/entity-col-money.eta +11 -0
  53. package/dist/lib/templates/entities/entity-col-numeric.eta +11 -0
  54. package/dist/lib/templates/entities/entity-col-point.eta +25 -0
  55. package/dist/lib/templates/entities/entity-col-real.eta +11 -0
  56. package/dist/lib/templates/entities/entity-col-serial.eta +12 -0
  57. package/dist/lib/templates/entities/entity-col-smallint.eta +11 -0
  58. package/dist/lib/templates/entities/entity-col-smallserial.eta +12 -0
  59. package/dist/lib/templates/entities/entity-col-string.eta +23 -0
  60. package/dist/lib/templates/entities/entity-col-text.eta +23 -0
  61. package/dist/lib/templates/entities/entity-col-time.eta +11 -0
  62. package/dist/lib/templates/entities/entity-col-timestamp.eta +4 -0
  63. package/dist/lib/templates/entities/entity-col-timestamptz.eta +4 -0
  64. package/dist/lib/templates/entities/entity-col-timetz.eta +11 -0
  65. package/dist/lib/templates/entities/entity-col-tsvector.eta +11 -0
  66. package/dist/lib/templates/entities/entity-col-uuid.eta +11 -0
  67. package/dist/lib/templates/entities/entity-col-varchar.eta +18 -0
  68. package/dist/lib/templates/entities/entity-col-xml.eta +11 -0
  69. package/dist/lib/templates/entities/entity.eta +116 -0
  70. package/dist/lib/templates/graphql/dto/dto-col-array.eta +4 -0
  71. package/dist/lib/templates/graphql/dto/dto-col-boolean.eta +6 -0
  72. package/dist/lib/templates/graphql/dto/dto-col-date.eta +4 -0
  73. package/dist/lib/templates/graphql/dto/dto-col-enum.eta +5 -0
  74. package/dist/lib/templates/graphql/dto/dto-col-float.eta +4 -0
  75. package/dist/lib/templates/graphql/dto/dto-col-integer.eta +4 -0
  76. package/dist/lib/templates/graphql/dto/dto-col-json-plain.eta +5 -0
  77. package/dist/lib/templates/graphql/dto/dto-col-json.eta +5 -0
  78. package/dist/lib/templates/graphql/dto/dto-col-text.eta +11 -0
  79. package/dist/lib/templates/graphql/dto/dto-col-timestamp.eta +3 -0
  80. package/dist/lib/templates/graphql/dto/dto-col-timestamptz.eta +3 -0
  81. package/dist/lib/templates/graphql/enums-graphql.eta +12 -0
  82. package/dist/lib/templates/graphql/gql-dto-graphql.eta +67 -0
  83. package/dist/lib/templates/graphql/index-module-graphql.eta +26 -0
  84. package/dist/lib/templates/graphql/module-graphql.eta +19 -0
  85. package/dist/lib/templates/header.eta +3 -0
  86. package/dist/lib/templates/rest/controller-rest-spec.eta +77 -0
  87. package/dist/lib/templates/rest/controller-rest.eta +171 -0
  88. package/dist/lib/templates/rest/dto-rest.eta +48 -0
  89. package/dist/lib/templates/rest/enums-rest.eta +7 -0
  90. package/dist/lib/templates/rest/index-module-rest.eta +11 -0
  91. package/dist/lib/templates/rest/module-rest.eta +16 -0
  92. package/dist/lib/templates/rest/ormconfig.eta +9 -0
  93. package/dist/lib/templates/rest/service-rest.eta +25 -0
  94. package/dist/lib/types/constraints.d.ts +4 -0
  95. package/dist/lib/types/constraints.js +2 -0
  96. package/dist/lib/types/entity.d.ts +13 -0
  97. package/dist/lib/types/entity.js +2 -0
  98. package/dist/lib/types/field.d.ts +16 -0
  99. package/dist/lib/types/field.js +2 -0
  100. package/dist/lib/types/index.d.ts +5 -0
  101. package/dist/lib/types/index.js +2 -0
  102. package/dist/lib/types/indices.d.ts +4 -0
  103. package/dist/lib/types/indices.js +2 -0
  104. package/dist/lib/types/json.d.ts +3 -0
  105. package/dist/lib/types/json.js +2 -0
  106. package/dist/lib/types/relationship.d.ts +43 -0
  107. package/dist/lib/types/relationship.js +2 -0
  108. package/dist/lib/utils/casing.d.ts +2 -0
  109. package/dist/lib/utils/casing.js +16 -0
  110. package/dist/lib/utils/field.d.ts +6 -0
  111. package/dist/lib/utils/field.js +65 -0
  112. package/dist/lib/utils/file-system.d.ts +2 -0
  113. package/dist/lib/utils/file-system.js +52 -0
  114. package/dist/lib/utils/relationships/index.d.ts +2 -0
  115. package/dist/lib/utils/relationships/index.js +11 -0
  116. package/dist/lib/utils/relationships/parse-v1.d.ts +4 -0
  117. package/dist/lib/utils/relationships/parse-v1.js +86 -0
  118. package/dist/lib/utils/relationships/parse.d.ts +11 -0
  119. package/dist/lib/utils/relationships/parse.js +192 -0
  120. package/dist/tests/templates/entities/types/array-template.spec.d.ts +1 -0
  121. package/dist/tests/templates/entities/types/array-template.spec.js +82 -0
  122. package/dist/tests/templates/entities/types/bigint-template.spec.d.ts +1 -0
  123. package/dist/tests/templates/entities/types/bigint-template.spec.js +82 -0
  124. package/dist/tests/templates/entities/types/boolean-template.spec.d.ts +1 -0
  125. package/dist/tests/templates/entities/types/boolean-template.spec.js +77 -0
  126. package/dist/tests/templates/entities/types/bytea-template.spec.d.ts +1 -0
  127. package/dist/tests/templates/entities/types/bytea-template.spec.js +68 -0
  128. package/dist/tests/templates/entities/types/char-template.spec.d.ts +1 -0
  129. package/dist/tests/templates/entities/types/char-template.spec.js +68 -0
  130. package/dist/tests/templates/entities/types/date-template.spec.d.ts +1 -0
  131. package/dist/tests/templates/entities/types/date-template.spec.js +56 -0
  132. package/dist/tests/templates/entities/types/decimal-template.spec.d.ts +1 -0
  133. package/dist/tests/templates/entities/types/decimal-template.spec.js +86 -0
  134. package/dist/tests/templates/entities/types/double-template.spec.d.ts +1 -0
  135. package/dist/tests/templates/entities/types/double-template.spec.js +67 -0
  136. package/dist/tests/templates/entities/types/enum-template.spec.d.ts +1 -0
  137. package/dist/tests/templates/entities/types/enum-template.spec.js +85 -0
  138. package/dist/tests/templates/entities/types/float-template.spec.d.ts +1 -0
  139. package/dist/tests/templates/entities/types/float-template.spec.js +67 -0
  140. package/dist/tests/templates/entities/types/inet-template.spec.d.ts +1 -0
  141. package/dist/tests/templates/entities/types/inet-template.spec.js +69 -0
  142. package/dist/tests/templates/entities/types/int4range-template.spec.d.ts +1 -0
  143. package/dist/tests/templates/entities/types/int4range-template.spec.js +60 -0
  144. package/dist/tests/templates/entities/types/integer-template.spec.d.ts +1 -0
  145. package/dist/tests/templates/entities/types/integer-template.spec.js +79 -0
  146. package/dist/tests/templates/entities/types/interval-template.spec.d.ts +1 -0
  147. package/dist/tests/templates/entities/types/interval-template.spec.js +68 -0
  148. package/dist/tests/templates/entities/types/json-plain-template.spec.d.ts +1 -0
  149. package/dist/tests/templates/entities/types/json-plain-template.spec.js +54 -0
  150. package/dist/tests/templates/entities/types/json-template.spec.d.ts +1 -0
  151. package/dist/tests/templates/entities/types/json-template.spec.js +40 -0
  152. package/dist/tests/templates/entities/types/jsonb-template.spec.d.ts +1 -0
  153. package/dist/tests/templates/entities/types/jsonb-template.spec.js +40 -0
  154. package/dist/tests/templates/entities/types/money-template.spec.d.ts +1 -0
  155. package/dist/tests/templates/entities/types/money-template.spec.js +68 -0
  156. package/dist/tests/templates/entities/types/numeric-template.spec.d.ts +1 -0
  157. package/dist/tests/templates/entities/types/numeric-template.spec.js +84 -0
  158. package/dist/tests/templates/entities/types/point-template.spec.d.ts +1 -0
  159. package/dist/tests/templates/entities/types/point-template.spec.js +58 -0
  160. package/dist/tests/templates/entities/types/real-template.spec.d.ts +1 -0
  161. package/dist/tests/templates/entities/types/real-template.spec.js +67 -0
  162. package/dist/tests/templates/entities/types/serial-template.spec.d.ts +1 -0
  163. package/dist/tests/templates/entities/types/serial-template.spec.js +113 -0
  164. package/dist/tests/templates/entities/types/smallint-template.spec.d.ts +1 -0
  165. package/dist/tests/templates/entities/types/smallint-template.spec.js +82 -0
  166. package/dist/tests/templates/entities/types/string-template.spec.d.ts +1 -0
  167. package/dist/tests/templates/entities/types/string-template.spec.js +111 -0
  168. package/dist/tests/templates/entities/types/text-template.spec.d.ts +1 -0
  169. package/dist/tests/templates/entities/types/text-template.spec.js +70 -0
  170. package/dist/tests/templates/entities/types/time-template.spec.d.ts +1 -0
  171. package/dist/tests/templates/entities/types/time-template.spec.js +68 -0
  172. package/dist/tests/templates/entities/types/timestamp-template.spec.d.ts +1 -0
  173. package/dist/tests/templates/entities/types/timestamp-template.spec.js +74 -0
  174. package/dist/tests/templates/entities/types/timetz-template.spec.d.ts +1 -0
  175. package/dist/tests/templates/entities/types/timetz-template.spec.js +68 -0
  176. package/dist/tests/templates/entities/types/tsvector-template.spec.d.ts +1 -0
  177. package/dist/tests/templates/entities/types/tsvector-template.spec.js +55 -0
  178. package/dist/tests/templates/entities/types/uuid-template.spec.d.ts +1 -0
  179. package/dist/tests/templates/entities/types/uuid-template.spec.js +82 -0
  180. package/dist/tests/templates/entities/types/varchar-template.spec.d.ts +1 -0
  181. package/dist/tests/templates/entities/types/varchar-template.spec.js +102 -0
  182. package/dist/tests/templates/entities/types/xml-template.spec.d.ts +1 -0
  183. package/dist/tests/templates/entities/types/xml-template.spec.js +55 -0
  184. package/dist/tests/templates/entities/utils/template-test-utils.d.ts +31 -0
  185. package/dist/tests/templates/entities/utils/template-test-utils.js +50 -0
  186. package/oclif.manifest.json +60 -1
  187. package/package.json +84 -55
  188. package/lib/commands/new.d.ts +0 -22
  189. package/lib/commands/new.js +0 -198
  190. package/lib/commands/scaffold.d.ts +0 -18
  191. package/lib/commands/scaffold.js +0 -106
  192. package/lib/index.d.ts +0 -1
  193. package/lib/lib/scaffold.d.ts +0 -30
  194. package/lib/lib/scaffold.js +0 -566
@@ -0,0 +1,26 @@
1
+ import { ApsorcRelationship, Entity, RelationshipMap } from "./types";
2
+ export declare enum ApiType {
3
+ Graphql = "graphql",
4
+ Rest = "rest"
5
+ }
6
+ export type ApsorcType = {
7
+ version: number;
8
+ rootFolder: string;
9
+ entities: Entity[];
10
+ apiType: ApiType;
11
+ relationships: ApsorcRelationship[];
12
+ };
13
+ type ParsedApsorcData = {
14
+ entities: Entity[];
15
+ relationshipMap: RelationshipMap;
16
+ };
17
+ type ParsedApsorc = {
18
+ rootFolder: string;
19
+ apiType: string;
20
+ entities: Entity[];
21
+ relationshipMap: RelationshipMap;
22
+ };
23
+ export declare const parseApsorcV1: (apsorc: ApsorcType) => ParsedApsorcData;
24
+ export declare const parseApsorcV2: (apsorc: ApsorcType) => ParsedApsorcData;
25
+ export declare const parseApsorc: () => ParsedApsorc;
26
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseApsorc = exports.parseApsorcV2 = exports.parseApsorcV1 = exports.ApiType = void 0;
4
+ const rc = require("rc");
5
+ const relationships_1 = require("./utils/relationships");
6
+ var ApiType;
7
+ (function (ApiType) {
8
+ ApiType["Graphql"] = "graphql";
9
+ ApiType["Rest"] = "rest";
10
+ })(ApiType = exports.ApiType || (exports.ApiType = {}));
11
+ const parseApsorcV1 = (apsorc) => {
12
+ const { entities } = apsorc;
13
+ const relationshipMap = (0, relationships_1.parseV1Relationships)(entities);
14
+ for (const entity of entities) {
15
+ delete entity.associations;
16
+ }
17
+ return { entities, relationshipMap };
18
+ };
19
+ exports.parseApsorcV1 = parseApsorcV1;
20
+ const parseApsorcV2 = (apsorc) => {
21
+ const { entities, relationships: apsoRelationships } = apsorc;
22
+ const relationshipMap = (0, relationships_1.parseRelationships)(apsoRelationships);
23
+ return { entities, relationshipMap };
24
+ };
25
+ exports.parseApsorcV2 = parseApsorcV2;
26
+ const parseRc = () => {
27
+ const apsoConfig = rc("apso");
28
+ const rootFolder = apsoConfig.rootFolder || "src";
29
+ const apiType = apsoConfig.apiType || "Rest";
30
+ const version = apsoConfig.version || 1;
31
+ const entities = apsoConfig.entities || [];
32
+ const relationships = apsoConfig.relationships || [];
33
+ return {
34
+ rootFolder,
35
+ apiType,
36
+ version,
37
+ entities,
38
+ relationships,
39
+ };
40
+ };
41
+ const parseApsorc = () => {
42
+ const apsoConfig = parseRc();
43
+ if (apsoConfig.version === 1 &&
44
+ (apsoConfig === null || apsoConfig === void 0 ? void 0 : apsoConfig.apiType.toLowerCase()) !== ApiType.Rest.toLowerCase()) {
45
+ throw new Error(`Graphql is not supported for apsorc version 1. In order to use Graphql make sure your apsorc file is version 2 compatible.`);
46
+ }
47
+ else {
48
+ switch (apsoConfig.version) {
49
+ case 1:
50
+ return {
51
+ rootFolder: apsoConfig.rootFolder,
52
+ apiType: apsoConfig.apiType,
53
+ ...(0, exports.parseApsorcV1)(apsoConfig),
54
+ };
55
+ case 2:
56
+ return {
57
+ rootFolder: apsoConfig.rootFolder,
58
+ apiType: apsoConfig.apiType,
59
+ ...(0, exports.parseApsorcV2)(apsoConfig),
60
+ };
61
+ }
62
+ throw new Error(`Invalid apsorc config version: ${apsoConfig.version}`);
63
+ }
64
+ };
65
+ exports.parseApsorc = parseApsorc;
@@ -0,0 +1,4 @@
1
+ import { Command } from "@oclif/core";
2
+ export default abstract class BaseCommand extends Command {
3
+ runNpmCommand(args: string[]): Promise<void>;
4
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const child_process_1 = require("child_process");
5
+ class BaseCommand extends core_1.Command {
6
+ async runNpmCommand(args) {
7
+ return new Promise((resolve, reject) => {
8
+ const command = "npm";
9
+ const cmdStr = `${command} ${args.join(" ")}`;
10
+ this.log(cmdStr);
11
+ const child = (0, child_process_1.spawn)(command, args, { stdio: "inherit" });
12
+ child.on("close", (code) => {
13
+ if (code !== 0) {
14
+ reject({
15
+ command: cmdStr,
16
+ });
17
+ return;
18
+ }
19
+ resolve();
20
+ });
21
+ });
22
+ }
23
+ }
24
+ exports.default = BaseCommand;
@@ -0,0 +1,2 @@
1
+ import { Entity, RelationshipMap } from "./types";
2
+ export declare const createController: (apiBaseDir: string, entity: Entity, relationshipMap: RelationshipMap) => Promise<void>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createController = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const file_system_1 = require("./utils/file-system");
8
+ const relationships_1 = require("./utils/relationships");
9
+ const createController = async (apiBaseDir, entity, relationshipMap) => {
10
+ const { name: entityName } = entity;
11
+ const File = path.join(apiBaseDir, `${entityName}.controller.ts`);
12
+ const testFile = path.join(apiBaseDir, `${entityName}.controller.spec.ts`);
13
+ // Dependencies
14
+ const svcName = `${entityName}Service`;
15
+ const ctrlName = `${entityName}Controller`;
16
+ const pluralEntityName = `${entityName}s`;
17
+ const relationships = (0, relationships_1.getRelationshipForTemplate)(entityName, relationshipMap[entityName]);
18
+ const nestedRelationships = (0, relationships_1.getNestedRelationships)(entityName, relationshipMap);
19
+ const data = {
20
+ svcName,
21
+ ctrlName,
22
+ entityName,
23
+ pluralEntityName,
24
+ // ensure uniqueness
25
+ associations: [...new Set(relationships)],
26
+ nestedAssociations: [...new Set(nestedRelationships)],
27
+ };
28
+ Eta.configure({
29
+ views: path.join(__dirname, "templates"),
30
+ });
31
+ const content = await Eta.renderFileAsync("./rest/controller-rest", data);
32
+ (0, file_system_1.createFile)(File, content);
33
+ const testContent = await Eta.renderFileAsync("./rest/controller-rest-spec", data);
34
+ (0, file_system_1.createFile)(testFile, testContent);
35
+ };
36
+ exports.createController = createController;
@@ -0,0 +1,7 @@
1
+ import { Entity, Relationship } from "./types";
2
+ export interface ComputedField {
3
+ name: string;
4
+ primary?: boolean;
5
+ dataType: string;
6
+ }
7
+ export declare const createDto: (apiBaseDir: string, entity: Entity, relationships: Relationship[]) => Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDto = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const file_system_1 = require("./utils/file-system");
8
+ const field_1 = require("./utils/field");
9
+ const relationships_1 = require("./utils/relationships");
10
+ const createDto = async (apiBaseDir, entity, relationships) => {
11
+ const { name, fields = [] } = entity;
12
+ const Dir = path.join(apiBaseDir, "dtos");
13
+ const File = path.join(Dir, `${name}.dto.ts`);
14
+ const relationshipFields = relationships
15
+ .filter((relationship) => relationship.type === "ManyToOne")
16
+ .map((relationship) => (0, relationships_1.getRelationshipIdField)(relationship));
17
+ const columns = [
18
+ ...fields.map((field) => ({
19
+ name: field.name,
20
+ type: field.type,
21
+ primary: field.primary,
22
+ dataType: field.type === "enum"
23
+ ? (0, field_1.fieldToEnumType)(field.name, name)
24
+ : (0, field_1.getJsTypeFromFieldType)(field.type),
25
+ })),
26
+ ...relationshipFields.map((fieldName) => ({
27
+ name: fieldName,
28
+ dataType: "number",
29
+ })),
30
+ ];
31
+ const primaryKeyColumns = columns.filter((column) => column.primary === true);
32
+ const addDefaultPKProperty = primaryKeyColumns.length === 0;
33
+ const createdAt = entity.created_at;
34
+ const updatedAt = entity.updated_at;
35
+ const data = {
36
+ name: entity.name,
37
+ addDefaultPKProperty,
38
+ createdAt,
39
+ updatedAt,
40
+ columns,
41
+ importEnums: (0, field_1.typeExistsInEntity)(entity, "enum") !== -1,
42
+ };
43
+ Eta.configure({
44
+ views: path.join(__dirname, "templates"),
45
+ });
46
+ const content = await Eta.renderFileAsync("./rest/dto-rest", data);
47
+ (0, file_system_1.createFile)(File, content);
48
+ };
49
+ exports.createDto = createDto;
@@ -0,0 +1,2 @@
1
+ import { Entity, Relationship } from "./types";
2
+ export declare const createEntity: (apiBaseDir: string, entity: Entity, relationshipsNew: Relationship[], apiType: string) => Promise<void>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEntity = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const pluralize_1 = tslib_1.__importDefault(require("pluralize"));
8
+ const file_system_1 = require("./utils/file-system");
9
+ const casing_1 = require("./utils/casing");
10
+ const field_1 = require("./utils/field");
11
+ const relationships_1 = require("./utils/relationships");
12
+ const createEntity = async (apiBaseDir, entity, relationshipsNew, apiType) => {
13
+ const { name, fields = [], indexes, uniques } = entity;
14
+ const File = path.join(apiBaseDir, `${name}.entity.ts`);
15
+ const columns = (0, field_1.getFieldForTemplate)(fields, name);
16
+ const createPrimaryKey = columns.filter((column) => column.primary === true)
17
+ .length === 0;
18
+ const createdAt = entity.created_at;
19
+ const updatedAt = entity.updated_at;
20
+ const relationships = (0, relationships_1.getRelationshipForTemplate)(name, relationshipsNew);
21
+ const entitiesToImport = (0, relationships_1.getRelationshipsForImport)(name, relationships);
22
+ const data = {
23
+ name,
24
+ indexes: indexes || [],
25
+ uniques: uniques || [],
26
+ createPrimaryKey,
27
+ snakeCasedName: (0, casing_1.snakeCase)(name),
28
+ createdAt,
29
+ updatedAt,
30
+ pluralizedName: (0, pluralize_1.default)((0, casing_1.camelCase)(name)),
31
+ columns,
32
+ associations: [...new Set(relationships)],
33
+ entitiesToImport,
34
+ importEnums: (0, field_1.typeExistsInEntity)(entity, "enum") !== -1,
35
+ apiType,
36
+ };
37
+ Eta.configure({
38
+ views: path.join(__dirname, "templates"),
39
+ });
40
+ const content = await Eta.renderFileAsync("./entities/entity", data);
41
+ (0, file_system_1.createFile)(File, content);
42
+ };
43
+ exports.createEntity = createEntity;
@@ -0,0 +1,6 @@
1
+ import { Entity } from "./types";
2
+ export interface EnumType {
3
+ name: string;
4
+ values?: string[];
5
+ }
6
+ export declare const createEnums: (apiBaseDir: string, entities: Entity[], apiType: string) => Promise<void>;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEnums = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const file_system_1 = require("./utils/file-system");
8
+ const field_1 = require("./utils/field");
9
+ const createEnums = async (apiBaseDir, entities, apiType) => {
10
+ if (entities.length > 0) {
11
+ const outputFile = path.join(apiBaseDir, "enums.ts");
12
+ const allEnumsFields = entities
13
+ .flatMap((entity) => (entity.fields || []).map((field) => {
14
+ if (field.type === "enum") {
15
+ return { ...field, name: (0, field_1.fieldToEnumType)(field.name, entity.name) };
16
+ }
17
+ return null;
18
+ }))
19
+ .filter(Boolean);
20
+ if (allEnumsFields.length > 0) {
21
+ Eta.configure({
22
+ views: path.join(__dirname, "templates"),
23
+ });
24
+ const content = await Eta.renderFileAsync(`./${apiType}/enums-${apiType}`, {
25
+ allEnumsFields,
26
+ });
27
+ (0, file_system_1.createFile)(outputFile, content);
28
+ }
29
+ }
30
+ };
31
+ exports.createEnums = createEnums;
@@ -0,0 +1,3 @@
1
+ import { Entity } from "./types/entity";
2
+ import { Relationship } from "./types";
3
+ export declare const createGqlDTO: (apiBaseDir: string, entity: Entity, relationshipsNew: Relationship[]) => Promise<void>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGqlDTO = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const pluralize_1 = tslib_1.__importDefault(require("pluralize"));
8
+ const field_1 = require("./utils/field");
9
+ const relationships_1 = require("./utils/relationships");
10
+ const casing_1 = require("./utils/casing");
11
+ const file_system_1 = require("./utils/file-system");
12
+ const createGqlDTO = async (apiBaseDir, entity, relationshipsNew) => {
13
+ const { name, fields = [], indexes } = entity;
14
+ const Dir = path.join(apiBaseDir, "dtos");
15
+ const File = path.join(Dir, `${name}.dto.ts`);
16
+ const columns = (0, field_1.getFieldForTemplate)(fields, name);
17
+ const createPrimaryKey = columns.filter((column) => column.primary === true)
18
+ .length === 0;
19
+ const createdAt = entity.created_at;
20
+ const updatedAt = entity.updated_at;
21
+ const relationships = (0, relationships_1.getRelationshipForTemplate)(name, relationshipsNew);
22
+ const entitiesToImport = (0, relationships_1.getRelationshipsForImport)(name, relationships);
23
+ const data = {
24
+ name,
25
+ indexes: indexes || [],
26
+ createPrimaryKey,
27
+ snakeCasedName: (0, casing_1.snakeCase)(name),
28
+ createdAt,
29
+ updatedAt,
30
+ pluralizedName: (0, pluralize_1.default)((0, casing_1.camelCase)(name)),
31
+ columns,
32
+ associations: relationships,
33
+ entitiesToImport,
34
+ importEnums: (0, field_1.typeExistsInEntity)(entity, "enum") !== -1,
35
+ };
36
+ Eta.configure({
37
+ // This tells Eta to look for templates in the /templates directory
38
+ views: path.join(__dirname, "templates"),
39
+ });
40
+ const contentEntity = await Eta.renderFileAsync("./graphql/gql-dto-graphql", data);
41
+ (0, file_system_1.createFile)(File, contentEntity);
42
+ };
43
+ exports.createGqlDTO = createGqlDTO;
@@ -0,0 +1,2 @@
1
+ import { Entity } from "./types";
2
+ export declare const createIndexAppModule: (apiBaseDir: string, entities: Entity[], apiType: string) => Promise<void>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIndexAppModule = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const file_system_1 = require("./utils/file-system");
6
+ const Eta = tslib_1.__importStar(require("eta"));
7
+ const path = tslib_1.__importStar(require("path"));
8
+ const createIndexAppModule = async (apiBaseDir, entities, apiType) => {
9
+ const File = path.join(apiBaseDir, `index.ts`);
10
+ Eta.configure({
11
+ views: path.join(__dirname, "templates"),
12
+ });
13
+ const content = await Eta.renderFileAsync(`./${apiType}/index-module-${apiType}`, {
14
+ entities,
15
+ });
16
+ (0, file_system_1.createFile)(File, content);
17
+ };
18
+ exports.createIndexAppModule = createIndexAppModule;
@@ -0,0 +1,10 @@
1
+ export { Entity, RelationshipMap } from "./types";
2
+ export { parseApsorc } from "./apsorc-parser";
3
+ export { createEntity } from "./entity";
4
+ export { createController } from "./controller";
5
+ export { createService } from "./service";
6
+ export { createModule } from "./module";
7
+ export { createIndexAppModule } from "./index-module";
8
+ export { createDto } from "./dto";
9
+ export { createEnums } from "./enums";
10
+ export { createGqlDTO } from "./gql-dto";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGqlDTO = exports.createEnums = exports.createDto = exports.createIndexAppModule = exports.createModule = exports.createService = exports.createController = exports.createEntity = exports.parseApsorc = void 0;
4
+ var apsorc_parser_1 = require("./apsorc-parser");
5
+ Object.defineProperty(exports, "parseApsorc", { enumerable: true, get: function () { return apsorc_parser_1.parseApsorc; } });
6
+ var entity_1 = require("./entity");
7
+ Object.defineProperty(exports, "createEntity", { enumerable: true, get: function () { return entity_1.createEntity; } });
8
+ var controller_1 = require("./controller");
9
+ Object.defineProperty(exports, "createController", { enumerable: true, get: function () { return controller_1.createController; } });
10
+ var service_1 = require("./service");
11
+ Object.defineProperty(exports, "createService", { enumerable: true, get: function () { return service_1.createService; } });
12
+ var module_1 = require("./module");
13
+ Object.defineProperty(exports, "createModule", { enumerable: true, get: function () { return module_1.createModule; } });
14
+ var index_module_1 = require("./index-module");
15
+ Object.defineProperty(exports, "createIndexAppModule", { enumerable: true, get: function () { return index_module_1.createIndexAppModule; } });
16
+ var dto_1 = require("./dto");
17
+ Object.defineProperty(exports, "createDto", { enumerable: true, get: function () { return dto_1.createDto; } });
18
+ var enums_1 = require("./enums");
19
+ Object.defineProperty(exports, "createEnums", { enumerable: true, get: function () { return enums_1.createEnums; } });
20
+ var gql_dto_1 = require("./gql-dto");
21
+ Object.defineProperty(exports, "createGqlDTO", { enumerable: true, get: function () { return gql_dto_1.createGqlDTO; } });
@@ -0,0 +1 @@
1
+ export declare const createModule: (apiBaseDir: string, entityName: string, apiType: string) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModule = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Eta = tslib_1.__importStar(require("eta"));
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const file_system_1 = require("./utils/file-system");
8
+ const createModule = async (apiBaseDir, entityName, apiType) => {
9
+ const File = path.join(apiBaseDir, `${entityName}.module.ts`);
10
+ // Dependencies
11
+ const svcName = `${entityName}Service`;
12
+ const ctrlName = `${entityName}Controller`;
13
+ const modName = `${entityName}Module`;
14
+ const pluralEntityName = `${entityName}s`;
15
+ const data = {
16
+ svcName,
17
+ ctrlName,
18
+ modName,
19
+ entityName,
20
+ pluralEntityName,
21
+ };
22
+ Eta.configure({
23
+ views: path.join(__dirname, "templates"),
24
+ });
25
+ const content = await Eta.renderFileAsync(`./${apiType}/module-${apiType}`, data);
26
+ (0, file_system_1.createFile)(File, content);
27
+ };
28
+ exports.createModule = createModule;
@@ -0,0 +1 @@
1
+ export declare const createService: (apiBaseDir: string, entityName: string) => Promise<void>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const file_system_1 = require("./utils/file-system");
6
+ const Eta = tslib_1.__importStar(require("eta"));
7
+ const path = tslib_1.__importStar(require("path"));
8
+ const createService = async (apiBaseDir, entityName) => {
9
+ const File = path.join(apiBaseDir, `${entityName}.service.ts`);
10
+ // Dependencies
11
+ const svcName = `${entityName}Service`;
12
+ const pluralEntityName = `${entityName}s`;
13
+ const data = {
14
+ svcName,
15
+ entityName,
16
+ pluralEntityName,
17
+ };
18
+ Eta.configure({
19
+ views: path.join(__dirname, "templates"),
20
+ });
21
+ const content = await Eta.renderFileAsync("./rest/service-rest", data);
22
+ (0, file_system_1.createFile)(File, content);
23
+ };
24
+ exports.createService = createService;
@@ -0,0 +1,12 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({
4
+ type: "<%= field.elementType || 'text' %>",
5
+ array: true<% if (field.nullable) {%>,
6
+ nullable: true<% } %>
7
+ })
8
+ <% if (field.index ) {%>
9
+ @Index()
10
+ <% } %>
11
+
12
+ <%= field.name %>: <%= field.elementType === 'int' || field.elementType === 'smallint' || field.elementType === 'decimal' || field.elementType === 'numeric' || field.elementType === 'real' || field.elementType === 'float8' ? 'number' : 'string' %>[];
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "bigint"<% if (field.default !== null) {%>, default: <%= field.default %><% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <% if (field.primary ) {%>
8
+ @PrimaryColumn()
9
+ <% } %>
10
+
11
+ <%= field.name %>: string;
@@ -0,0 +1,12 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "bigint" })
4
+ @Generated("increment")
5
+ <% if (field.index ) {%>
6
+ @Index()
7
+ <% } %>
8
+ <% if (field.primary ) {%>
9
+ @PrimaryColumn()
10
+ <% } %>
11
+
12
+ <%= field.name %>: string;
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @IsOptional({ groups: [CREATE, UPDATE] })
4
+ @IsBoolean({ always: true })
5
+
6
+ @Column({ type: 'boolean', default: <%= Boolean(field.default) || false %> })
7
+ <% if (field.index ) {%>
8
+ @Index()
9
+ <% } %>
10
+
11
+ <%= field.name %>!: <%= field.dataType %>;
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "bytea"<% if (field.default !== null) {%>, default: <%= field.default %><% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <% if (field.primary ) {%>
8
+ @PrimaryColumn()
9
+ <% } %>
10
+
11
+ <%= field.name %>: Buffer;
@@ -0,0 +1,15 @@
1
+ <% const {field} = it; %>
2
+
3
+ @IsOptional({ groups: [UPDATE] })
4
+ <% if (!field.nullable && !field.auto) { %>
5
+ @IsNotEmpty({ groups: [CREATE] })
6
+ <% } %>
7
+ <% if (field.index ) {%>
8
+ @Index()
9
+ <% } %>
10
+ @Column({ type: "char", length: <%= field.length || 1 %>, nullable: <%= Boolean(field.nullable) %><% if (field.unique) {%>, unique: true <% } %><% if (field.default !== null) {%>, default: '<%= field.default %>'<% } %> })
11
+ <% if (field.primary ) {%>
12
+ @PrimaryColumn()
13
+ <% } %>
14
+
15
+ <%= field.name %>: string;
@@ -0,0 +1,8 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ type: 'date', nullable: <%= Boolean(field.nullable) %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+
8
+ <%= field.name %>: string;
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "decimal", precision: <%= field.precision || 10 %>, scale: <%= field.scale || 2 %><% if (field.default !== null) {%>, default: <%= field.default %><% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <% if (field.primary ) {%>
8
+ @PrimaryColumn()
9
+ <% } %>
10
+
11
+ <%= field.name %>: number;
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "float8"<% if (field.default !== null) {%>, default: <%= field.default %><% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <% if (field.primary ) {%>
8
+ @PrimaryColumn()
9
+ <% } %>
10
+
11
+ <%= field.name %>: number;
@@ -0,0 +1,12 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({
4
+ type: 'enum',
5
+ enum: enums.<%= field.dataType%>,
6
+ default: enums.<%= field.dataType%>.<%= field.default %>
7
+ })
8
+ <% if (field.index ) {%>
9
+ @Index()
10
+ <% } %>
11
+
12
+ <%= field.name %>!: enums.<%= field.dataType%>;
@@ -0,0 +1,7 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "decimal"<% if (field.default !== null) {%>, default: <%= field.default %><% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <%= field.name %>: number;
@@ -0,0 +1,11 @@
1
+ <% const {field} = it; %>
2
+
3
+ @Column({ "type": "inet"<% if (field.default !== null) {%>, default: <%= field.default %><% } %><% if (field.nullable) {%>, nullable: true<% } %> })
4
+ <% if (field.index ) {%>
5
+ @Index()
6
+ <% } %>
7
+ <% if (field.primary ) {%>
8
+ @PrimaryColumn()
9
+ <% } %>
10
+
11
+ <%= field.name %>: string;