@apso/cli 0.5.0 → 0.7.0

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 (69) hide show
  1. package/README.md +510 -1
  2. package/dist/commands/server/new.js +1 -1
  3. package/dist/commands/server/scaffold.js +19 -10
  4. package/dist/lib/apsorc-parser.d.ts +3 -0
  5. package/dist/lib/apsorc-parser.js +11 -6
  6. package/dist/lib/controller.js +3 -1
  7. package/dist/lib/dto.js +9 -9
  8. package/dist/lib/entity.js +6 -5
  9. package/dist/lib/guards.d.ts +4 -3
  10. package/dist/lib/guards.js +64 -25
  11. package/dist/lib/module.js +3 -1
  12. package/dist/lib/templates/guards/auth.guard.eta +228 -0
  13. package/dist/lib/templates/guards/guards.module.eta +73 -13
  14. package/dist/lib/templates/guards/index.eta +18 -0
  15. package/dist/lib/templates/guards/scope.guard.eta +12 -4
  16. package/dist/lib/types/auth.d.ts +203 -0
  17. package/dist/lib/types/auth.js +60 -0
  18. package/dist/lib/types/entity.d.ts +2 -2
  19. package/dist/lib/types/index.d.ts +1 -0
  20. package/dist/lib/types/index.js +8 -0
  21. package/dist/lib/types/relationship.d.ts +1 -1
  22. package/dist/lib/utils/casing.js +5 -5
  23. package/dist/lib/utils/field.js +2 -1
  24. package/dist/lib/utils/file-system.js +1 -1
  25. package/dist/lib/utils/relationships/parse-v1.js +2 -1
  26. package/dist/lib/utils/relationships/parse.js +117 -32
  27. package/dist/lib/utils/relationships/parse.spec.js +168 -141
  28. package/dist/test-nested-relationships.js +10 -10
  29. package/dist/tests/templates/entities/types/array-template.spec.js +45 -45
  30. package/dist/tests/templates/entities/types/bigint-template.spec.js +43 -43
  31. package/dist/tests/templates/entities/types/boolean-template.spec.js +44 -44
  32. package/dist/tests/templates/entities/types/bytea-template.spec.js +35 -35
  33. package/dist/tests/templates/entities/types/char-template.spec.js +35 -35
  34. package/dist/tests/templates/entities/types/date-template.spec.js +29 -29
  35. package/dist/tests/templates/entities/types/decimal-field-validation.spec.js +46 -46
  36. package/dist/tests/templates/entities/types/decimal-template.spec.js +46 -46
  37. package/dist/tests/templates/entities/types/double-template.spec.js +37 -34
  38. package/dist/tests/templates/entities/types/enum-template.spec.js +42 -42
  39. package/dist/tests/templates/entities/types/float-template.spec.js +37 -34
  40. package/dist/tests/templates/entities/types/geometry-template.spec.js +31 -31
  41. package/dist/tests/templates/entities/types/inet-template.spec.js +36 -36
  42. package/dist/tests/templates/entities/types/int4range-template.spec.js +45 -33
  43. package/dist/tests/templates/entities/types/integer-template.spec.js +40 -40
  44. package/dist/tests/templates/entities/types/interval-template.spec.js +35 -35
  45. package/dist/tests/templates/entities/types/json-plain-template.spec.js +27 -27
  46. package/dist/tests/templates/entities/types/json-template.spec.js +19 -19
  47. package/dist/tests/templates/entities/types/jsonb-template.spec.js +19 -19
  48. package/dist/tests/templates/entities/types/money-template.spec.js +35 -35
  49. package/dist/tests/templates/entities/types/numeric-template.spec.js +44 -44
  50. package/dist/tests/templates/entities/types/point-template.spec.js +37 -31
  51. package/dist/tests/templates/entities/types/polygon-template.spec.js +43 -31
  52. package/dist/tests/templates/entities/types/real-template.spec.js +34 -34
  53. package/dist/tests/templates/entities/types/serial-template.spec.js +62 -62
  54. package/dist/tests/templates/entities/types/smallint-template.spec.js +43 -43
  55. package/dist/tests/templates/entities/types/string-template.spec.js +59 -59
  56. package/dist/tests/templates/entities/types/text-template.spec.js +37 -37
  57. package/dist/tests/templates/entities/types/time-template.spec.js +35 -35
  58. package/dist/tests/templates/entities/types/timestamp-template.spec.js +39 -39
  59. package/dist/tests/templates/entities/types/timetz-template.spec.js +35 -35
  60. package/dist/tests/templates/entities/types/tsvector-template.spec.js +28 -28
  61. package/dist/tests/templates/entities/types/uuid-template.spec.js +43 -43
  62. package/dist/tests/templates/entities/types/varchar-template.spec.js +59 -56
  63. package/dist/tests/templates/entities/types/xml-template.spec.js +28 -28
  64. package/dist/tests/templates/entities/utils/template-test-utils.d.ts +1 -1
  65. package/dist/tests/templates/entities/utils/template-test-utils.js +3 -3
  66. package/dist/tests/templates/entities/uuid-entity-template.spec.js +138 -138
  67. package/dist/tests/utils/relationship-deduplication.spec.js +11 -11
  68. package/oclif.manifest.json +1 -1
  69. package/package.json +1 -1
@@ -2,54 +2,54 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const template_test_utils_1 = require("../utils/template-test-utils");
4
4
  const globals_1 = require("@jest/globals");
5
- (0, globals_1.describe)('TSVector Entity Template Tests', () => {
5
+ (0, globals_1.describe)("TSVector Entity Template Tests", () => {
6
6
  // Setup Eta configuration once before all tests
7
7
  (0, globals_1.beforeAll)(() => {
8
8
  (0, template_test_utils_1.configureEta)();
9
9
  });
10
- const templatePath = './entities/entity-col-tsvector';
10
+ const templatePath = "./entities/entity-col-tsvector";
11
11
  const testCases = [
12
12
  {
13
- name: 'should render basic tsvector field correctly',
13
+ name: "should render basic tsvector field correctly",
14
14
  field: {
15
- name: 'searchVector',
16
- dataType: 'string',
17
- nullable: false
15
+ name: "searchVector",
16
+ dataType: "string",
17
+ nullable: false,
18
18
  },
19
19
  assertions: [
20
- { type: 'contains', text: '@Column({ "type": "tsvector"' },
21
- { type: 'contains', text: 'searchVector: string;' },
22
- { type: 'notContains', text: '@Index()' },
23
- { type: 'notContains', text: '@PrimaryColumn()' }
24
- ]
20
+ { type: "contains", text: '@Column({ "type": "tsvector"' },
21
+ { type: "contains", text: "searchVector: string;" },
22
+ { type: "notContains", text: "@Index()" },
23
+ { type: "notContains", text: "@PrimaryColumn()" },
24
+ ],
25
25
  },
26
26
  {
27
- name: 'should render nullable tsvector field correctly',
27
+ name: "should render nullable tsvector field correctly",
28
28
  field: {
29
- name: 'optionalVector',
30
- dataType: 'string',
31
- nullable: true
29
+ name: "optionalVector",
30
+ dataType: "string",
31
+ nullable: true,
32
32
  },
33
33
  assertions: [
34
- { type: 'contains', text: '@Column({ "type": "tsvector"' },
35
- { type: 'contains', text: 'nullable: true' },
36
- { type: 'contains', text: 'optionalVector: string;' }
37
- ]
34
+ { type: "contains", text: '@Column({ "type": "tsvector"' },
35
+ { type: "contains", text: "nullable: true" },
36
+ { type: "contains", text: "optionalVector: string;" },
37
+ ],
38
38
  },
39
39
  {
40
- name: 'should render indexed tsvector field correctly',
40
+ name: "should render indexed tsvector field correctly",
41
41
  field: {
42
- name: 'indexedVector',
43
- dataType: 'string',
42
+ name: "indexedVector",
43
+ dataType: "string",
44
44
  nullable: false,
45
- index: true
45
+ index: true,
46
46
  },
47
47
  assertions: [
48
- { type: 'contains', text: '@Column({ "type": "tsvector"' },
49
- { type: 'contains', text: '@Index()' },
50
- { type: 'contains', text: 'indexedVector: string;' }
51
- ]
52
- }
48
+ { type: "contains", text: '@Column({ "type": "tsvector"' },
49
+ { type: "contains", text: "@Index()" },
50
+ { type: "contains", text: "indexedVector: string;" },
51
+ ],
52
+ },
53
53
  ];
54
54
  (0, template_test_utils_1.runTemplateTests)(templatePath, testCases);
55
55
  });
@@ -2,81 +2,81 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const template_test_utils_1 = require("../utils/template-test-utils");
4
4
  const globals_1 = require("@jest/globals");
5
- (0, globals_1.describe)('UUID Entity Template Tests', () => {
5
+ (0, globals_1.describe)("UUID Entity Template Tests", () => {
6
6
  // Setup Eta configuration once before all tests
7
7
  (0, globals_1.beforeAll)(() => {
8
8
  (0, template_test_utils_1.configureEta)();
9
9
  });
10
- const templatePath = './entities/entity-col-uuid';
10
+ const templatePath = "./entities/entity-col-uuid";
11
11
  const testCases = [
12
12
  {
13
- name: 'should render basic uuid field correctly',
13
+ name: "should render basic uuid field correctly",
14
14
  field: {
15
- name: 'id',
16
- dataType: 'string',
17
- nullable: false
15
+ name: "id",
16
+ dataType: "string",
17
+ nullable: false,
18
18
  },
19
19
  assertions: [
20
- { type: 'contains', text: '@Column({ "type": "uuid"' },
21
- { type: 'contains', text: 'id: string;' },
22
- { type: 'notContains', text: '@Index()' },
23
- { type: 'notContains', text: '@PrimaryColumn()' }
24
- ]
20
+ { type: "contains", text: '@Column({ "type": "uuid"' },
21
+ { type: "contains", text: "id: string;" },
22
+ { type: "notContains", text: "@Index()" },
23
+ { type: "notContains", text: "@PrimaryColumn()" },
24
+ ],
25
25
  },
26
26
  {
27
- name: 'should render nullable uuid field correctly',
27
+ name: "should render nullable uuid field correctly",
28
28
  field: {
29
- name: 'optionalId',
30
- dataType: 'string',
31
- nullable: true
29
+ name: "optionalId",
30
+ dataType: "string",
31
+ nullable: true,
32
32
  },
33
33
  assertions: [
34
- { type: 'contains', text: '@Column({ "type": "uuid"' },
35
- { type: 'contains', text: 'optionalId: string;' }
36
- ]
34
+ { type: "contains", text: '@Column({ "type": "uuid"' },
35
+ { type: "contains", text: "optionalId: string;" },
36
+ ],
37
37
  },
38
38
  {
39
- name: 'should render uuid field with default value correctly',
39
+ name: "should render uuid field with default value correctly",
40
40
  field: {
41
- name: 'defaultId',
42
- dataType: 'string',
41
+ name: "defaultId",
42
+ dataType: "string",
43
43
  nullable: false,
44
- default: 'uuid_generate_v4()'
44
+ default: "uuid_generate_v4()",
45
45
  },
46
46
  assertions: [
47
- { type: 'contains', text: '@Column({ "type": "uuid"' },
48
- { type: 'contains', text: 'default: uuid_generate_v4()' },
49
- { type: 'contains', text: 'defaultId: string;' }
50
- ]
47
+ { type: "contains", text: '@Column({ "type": "uuid"' },
48
+ { type: "contains", text: "default: uuid_generate_v4()" },
49
+ { type: "contains", text: "defaultId: string;" },
50
+ ],
51
51
  },
52
52
  {
53
- name: 'should render indexed uuid field correctly',
53
+ name: "should render indexed uuid field correctly",
54
54
  field: {
55
- name: 'indexedId',
56
- dataType: 'string',
55
+ name: "indexedId",
56
+ dataType: "string",
57
57
  nullable: false,
58
- index: true
58
+ index: true,
59
59
  },
60
60
  assertions: [
61
- { type: 'contains', text: '@Column({ "type": "uuid"' },
62
- { type: 'contains', text: '@Index()' },
63
- { type: 'contains', text: 'indexedId: string;' }
64
- ]
61
+ { type: "contains", text: '@Column({ "type": "uuid"' },
62
+ { type: "contains", text: "@Index()" },
63
+ { type: "contains", text: "indexedId: string;" },
64
+ ],
65
65
  },
66
66
  {
67
- name: 'should render primary key uuid field correctly',
67
+ name: "should render primary key uuid field correctly",
68
68
  field: {
69
- name: 'primaryId',
70
- dataType: 'string',
69
+ name: "primaryId",
70
+ dataType: "string",
71
71
  nullable: false,
72
- primary: true
72
+ primary: true,
73
73
  },
74
74
  assertions: [
75
- { type: 'contains', text: '@Column({ "type": "uuid"' },
76
- { type: 'contains', text: '@PrimaryColumn()' },
77
- { type: 'contains', text: 'primaryId: string;' }
78
- ]
79
- }
75
+ { type: "contains", text: '@Column({ "type": "uuid"' },
76
+ { type: "contains", text: "@PrimaryColumn()" },
77
+ { type: "contains", text: "primaryId: string;" },
78
+ ],
79
+ },
80
80
  ];
81
81
  (0, template_test_utils_1.runTemplateTests)(templatePath, testCases);
82
82
  });
@@ -2,101 +2,104 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const template_test_utils_1 = require("../utils/template-test-utils");
4
4
  const globals_1 = require("@jest/globals");
5
- (0, globals_1.describe)('Varchar Entity Template Tests', () => {
5
+ (0, globals_1.describe)("Varchar Entity Template Tests", () => {
6
6
  // Setup Eta configuration once before all tests
7
7
  (0, globals_1.beforeAll)(() => {
8
8
  (0, template_test_utils_1.configureEta)();
9
9
  });
10
- const templatePath = './entities/entity-col-varchar';
10
+ const templatePath = "./entities/entity-col-varchar";
11
11
  const testCases = [
12
12
  {
13
- name: 'should render basic varchar field correctly',
13
+ name: "should render basic varchar field correctly",
14
14
  field: {
15
- name: 'name',
16
- dataType: 'string',
17
- nullable: false
15
+ name: "name",
16
+ dataType: "string",
17
+ nullable: false,
18
18
  },
19
19
  assertions: [
20
- { type: 'contains', text: '@IsOptional({ groups: [UPDATE] })' },
21
- { type: 'contains', text: '@IsNotEmpty({ groups: [CREATE] })' },
22
- { type: 'contains', text: '@Column({ type: "varchar", length: 255' },
23
- { type: 'contains', text: 'nullable: false' },
24
- { type: 'contains', text: 'name: string;' },
25
- { type: 'notContains', text: '@Index()' },
26
- { type: 'notContains', text: '@IsEmail' }
27
- ]
20
+ { type: "contains", text: "@IsOptional({ groups: [UPDATE] })" },
21
+ { type: "contains", text: "@IsNotEmpty({ groups: [CREATE] })" },
22
+ { type: "contains", text: '@Column({ type: "varchar", length: 255' },
23
+ { type: "contains", text: "nullable: false" },
24
+ { type: "contains", text: "name: string;" },
25
+ { type: "notContains", text: "@Index()" },
26
+ { type: "notContains", text: "@IsEmail" },
27
+ ],
28
28
  },
29
29
  {
30
- name: 'should render nullable varchar field correctly',
30
+ name: "should render nullable varchar field correctly",
31
31
  field: {
32
- name: 'description',
33
- dataType: 'string',
34
- nullable: true
32
+ name: "description",
33
+ dataType: "string",
34
+ nullable: true,
35
35
  },
36
36
  assertions: [
37
- { type: 'contains', text: '@IsOptional({ groups: [UPDATE] })' },
38
- { type: 'contains', text: '@Column({ type: "varchar"' },
39
- { type: 'contains', text: 'nullable: true' },
40
- { type: 'contains', text: 'description: string;' },
41
- { type: 'notContains', text: '@IsNotEmpty' }
42
- ]
37
+ { type: "contains", text: "@IsOptional({ groups: [UPDATE] })" },
38
+ { type: "contains", text: '@Column({ type: "varchar"' },
39
+ { type: "contains", text: "nullable: true" },
40
+ { type: "contains", text: "description: string;" },
41
+ { type: "notContains", text: "@IsNotEmpty" },
42
+ ],
43
43
  },
44
44
  {
45
- name: 'should render varchar field with custom length correctly',
45
+ name: "should render varchar field with custom length correctly",
46
46
  field: {
47
- name: 'code',
48
- dataType: 'string',
47
+ name: "code",
48
+ dataType: "string",
49
49
  nullable: false,
50
- length: 50
50
+ length: 50,
51
51
  },
52
52
  assertions: [
53
- { type: 'contains', text: '@Column({ type: "varchar", length: 50' },
54
- { type: 'contains', text: 'code: string;' }
55
- ]
53
+ { type: "contains", text: '@Column({ type: "varchar", length: 50' },
54
+ { type: "contains", text: "code: string;" },
55
+ ],
56
56
  },
57
57
  {
58
- name: 'should render unique varchar field correctly',
58
+ name: "should render unique varchar field correctly",
59
59
  field: {
60
- name: 'username',
61
- dataType: 'string',
60
+ name: "username",
61
+ dataType: "string",
62
62
  nullable: false,
63
- unique: true
63
+ unique: true,
64
64
  },
65
65
  assertions: [
66
- { type: 'contains', text: '@Column({ type: "varchar"' },
67
- { type: 'contains', text: 'unique: true' },
68
- { type: 'contains', text: 'username: string;' }
69
- ]
66
+ { type: "contains", text: '@Column({ type: "varchar"' },
67
+ { type: "contains", text: "unique: true" },
68
+ { type: "contains", text: "username: string;" },
69
+ ],
70
70
  },
71
71
  {
72
- name: 'should render email field correctly',
72
+ name: "should render email field correctly",
73
73
  field: {
74
- name: 'email',
75
- dataType: 'string',
74
+ name: "email",
75
+ dataType: "string",
76
76
  nullable: false,
77
77
  // eslint-disable-next-line camelcase
78
- is_email: true
78
+ is_email: true,
79
79
  },
80
80
  assertions: [
81
- { type: 'contains', text: '@IsEmail({ require_tld: false }, { always: true })' },
82
- { type: 'contains', text: '@Column({ type: "varchar"' },
83
- { type: 'contains', text: 'email: string;' }
84
- ]
81
+ {
82
+ type: "contains",
83
+ text: "@IsEmail({ require_tld: false }, { always: true })",
84
+ },
85
+ { type: "contains", text: '@Column({ type: "varchar"' },
86
+ { type: "contains", text: "email: string;" },
87
+ ],
85
88
  },
86
89
  {
87
- name: 'should render indexed varchar field correctly',
90
+ name: "should render indexed varchar field correctly",
88
91
  field: {
89
- name: 'indexedField',
90
- dataType: 'string',
92
+ name: "indexedField",
93
+ dataType: "string",
91
94
  nullable: false,
92
- index: true
95
+ index: true,
93
96
  },
94
97
  assertions: [
95
- { type: 'contains', text: '@Column({ type: "varchar"' },
96
- { type: 'contains', text: '@Index()' },
97
- { type: 'contains', text: 'indexedField: string;' }
98
- ]
99
- }
98
+ { type: "contains", text: '@Column({ type: "varchar"' },
99
+ { type: "contains", text: "@Index()" },
100
+ { type: "contains", text: "indexedField: string;" },
101
+ ],
102
+ },
100
103
  ];
101
104
  (0, template_test_utils_1.runTemplateTests)(templatePath, testCases);
102
105
  });
@@ -2,54 +2,54 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const template_test_utils_1 = require("../utils/template-test-utils");
4
4
  const globals_1 = require("@jest/globals");
5
- (0, globals_1.describe)('XML Entity Template Tests', () => {
5
+ (0, globals_1.describe)("XML Entity Template Tests", () => {
6
6
  // Setup Eta configuration once before all tests
7
7
  (0, globals_1.beforeAll)(() => {
8
8
  (0, template_test_utils_1.configureEta)();
9
9
  });
10
- const templatePath = './entities/entity-col-xml';
10
+ const templatePath = "./entities/entity-col-xml";
11
11
  const testCases = [
12
12
  {
13
- name: 'should render basic xml field correctly',
13
+ name: "should render basic xml field correctly",
14
14
  field: {
15
- name: 'xmlContent',
16
- dataType: 'string',
17
- nullable: false
15
+ name: "xmlContent",
16
+ dataType: "string",
17
+ nullable: false,
18
18
  },
19
19
  assertions: [
20
- { type: 'contains', text: '@Column({ "type": "xml"' },
21
- { type: 'contains', text: 'xmlContent: string;' },
22
- { type: 'notContains', text: '@Index()' },
23
- { type: 'notContains', text: '@PrimaryColumn()' }
24
- ]
20
+ { type: "contains", text: '@Column({ "type": "xml"' },
21
+ { type: "contains", text: "xmlContent: string;" },
22
+ { type: "notContains", text: "@Index()" },
23
+ { type: "notContains", text: "@PrimaryColumn()" },
24
+ ],
25
25
  },
26
26
  {
27
- name: 'should render nullable xml field correctly',
27
+ name: "should render nullable xml field correctly",
28
28
  field: {
29
- name: 'optionalXml',
30
- dataType: 'string',
31
- nullable: true
29
+ name: "optionalXml",
30
+ dataType: "string",
31
+ nullable: true,
32
32
  },
33
33
  assertions: [
34
- { type: 'contains', text: '@Column({ "type": "xml"' },
35
- { type: 'contains', text: 'nullable: true' },
36
- { type: 'contains', text: 'optionalXml: string;' }
37
- ]
34
+ { type: "contains", text: '@Column({ "type": "xml"' },
35
+ { type: "contains", text: "nullable: true" },
36
+ { type: "contains", text: "optionalXml: string;" },
37
+ ],
38
38
  },
39
39
  {
40
- name: 'should render indexed xml field correctly',
40
+ name: "should render indexed xml field correctly",
41
41
  field: {
42
- name: 'indexedXml',
43
- dataType: 'string',
42
+ name: "indexedXml",
43
+ dataType: "string",
44
44
  nullable: false,
45
- index: true
45
+ index: true,
46
46
  },
47
47
  assertions: [
48
- { type: 'contains', text: '@Column({ "type": "xml"' },
49
- { type: 'contains', text: '@Index()' },
50
- { type: 'contains', text: 'indexedXml: string;' }
51
- ]
52
- }
48
+ { type: "contains", text: '@Column({ "type": "xml"' },
49
+ { type: "contains", text: "@Index()" },
50
+ { type: "contains", text: "indexedXml: string;" },
51
+ ],
52
+ },
53
53
  ];
54
54
  (0, template_test_utils_1.runTemplateTests)(templatePath, testCases);
55
55
  });
@@ -17,7 +17,7 @@ export interface TemplateTestCase {
17
17
  name: string;
18
18
  field: any;
19
19
  assertions: Array<{
20
- type: 'contains' | 'notContains';
20
+ type: "contains" | "notContains";
21
21
  text: string;
22
22
  }>;
23
23
  }
@@ -11,7 +11,7 @@ const globals_1 = require("@jest/globals");
11
11
  */
12
12
  function configureEta() {
13
13
  Eta.configure({
14
- views: path.join(__dirname, '../../../../lib/templates'),
14
+ views: path.join(__dirname, "../../../../lib/templates"),
15
15
  });
16
16
  }
17
17
  exports.configureEta = configureEta;
@@ -33,11 +33,11 @@ exports.renderTemplate = renderTemplate;
33
33
  * @returns {void} Nothing
34
34
  */
35
35
  function runTemplateTests(templatePath, testCases) {
36
- testCases.forEach(testCase => {
36
+ testCases.forEach((testCase) => {
37
37
  (0, globals_1.it)(testCase.name, async () => {
38
38
  const rendered = await renderTemplate(templatePath, testCase.field);
39
39
  for (const assertion of testCase.assertions) {
40
- if (assertion.type === 'contains') {
40
+ if (assertion.type === "contains") {
41
41
  (0, globals_1.expect)(rendered).toContain(assertion.text);
42
42
  }
43
43
  else {