@carlonicora/nestjs-neo4jsonapi 1.31.2 → 1.32.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 (238) hide show
  1. package/dist/common/helpers/define-entity.d.ts +29 -0
  2. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  3. package/dist/common/helpers/define-entity.js +42 -1
  4. package/dist/common/helpers/define-entity.js.map +1 -1
  5. package/dist/common/interfaces/entity.descriptor.interface.d.ts +2 -2
  6. package/dist/common/interfaces/entity.descriptor.interface.d.ts.map +1 -1
  7. package/dist/common/interfaces/entity.descriptor.interface.js +2 -1
  8. package/dist/common/interfaces/entity.descriptor.interface.js.map +1 -1
  9. package/dist/common/interfaces/entity.schema.interface.d.ts +19 -1
  10. package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
  11. package/dist/core/email/templates/en/paymentFailure.hbs +56 -0
  12. package/dist/core/email/templates/en/paymentSuccessAdmin.hbs +31 -0
  13. package/dist/core/email/templates/en/paymentSuccessCustomer.hbs +51 -0
  14. package/dist/core/email/templates/en/subscriptionStatusChange.hbs +48 -0
  15. package/dist/core/jsonapi/serialisers/descriptor.based.serialiser.d.ts.map +1 -1
  16. package/dist/core/jsonapi/serialisers/descriptor.based.serialiser.js +13 -0
  17. package/dist/core/jsonapi/serialisers/descriptor.based.serialiser.js.map +1 -1
  18. package/dist/core/jsonapi/serialisers/jsonapi.paginator.d.ts +3 -0
  19. package/dist/core/jsonapi/serialisers/jsonapi.paginator.d.ts.map +1 -1
  20. package/dist/core/jsonapi/serialisers/jsonapi.paginator.js +6 -0
  21. package/dist/core/jsonapi/serialisers/jsonapi.paginator.js.map +1 -1
  22. package/dist/core/jsonapi/services/jsonapi.service.d.ts.map +1 -1
  23. package/dist/core/jsonapi/services/jsonapi.service.js +6 -0
  24. package/dist/core/jsonapi/services/jsonapi.service.js.map +1 -1
  25. package/dist/core/neo4j/abstracts/abstract.service.d.ts +2 -0
  26. package/dist/core/neo4j/abstracts/abstract.service.d.ts.map +1 -1
  27. package/dist/core/neo4j/abstracts/abstract.service.js +8 -4
  28. package/dist/core/neo4j/abstracts/abstract.service.js.map +1 -1
  29. package/dist/core/neo4j/services/neo4j.service.d.ts +9 -0
  30. package/dist/core/neo4j/services/neo4j.service.d.ts.map +1 -1
  31. package/dist/core/neo4j/services/neo4j.service.js +95 -1
  32. package/dist/core/neo4j/services/neo4j.service.js.map +1 -1
  33. package/dist/foundations/audit/entities/audit.entity.d.ts +1 -1
  34. package/dist/foundations/audit/entities/audit.entity.d.ts.map +1 -1
  35. package/dist/foundations/audit/serialisers/audit.serialiser.js +2 -2
  36. package/dist/foundations/audit/serialisers/audit.serialiser.js.map +1 -1
  37. package/dist/foundations/auth/entities/auth.entity.d.ts +1 -1
  38. package/dist/foundations/auth/entities/auth.entity.d.ts.map +1 -1
  39. package/dist/foundations/auth/repositories/auth.repository.d.ts +1 -1
  40. package/dist/foundations/auth/repositories/auth.repository.d.ts.map +1 -1
  41. package/dist/foundations/auth/repositories/auth.repository.js +31 -13
  42. package/dist/foundations/auth/repositories/auth.repository.js.map +1 -1
  43. package/dist/foundations/auth/serialisers/auth.serialiser.js +2 -2
  44. package/dist/foundations/auth/serialisers/auth.serialiser.js.map +1 -1
  45. package/dist/foundations/auth/services/auth.service.d.ts +1 -1
  46. package/dist/foundations/auth/services/auth.service.d.ts.map +1 -1
  47. package/dist/foundations/company/company.module.d.ts.map +1 -1
  48. package/dist/foundations/company/company.module.js +9 -5
  49. package/dist/foundations/company/company.module.js.map +1 -1
  50. package/dist/foundations/company/entities/company.d.ts +44 -0
  51. package/dist/foundations/company/entities/company.d.ts.map +1 -0
  52. package/dist/foundations/company/entities/company.js +47 -0
  53. package/dist/foundations/company/entities/company.js.map +1 -0
  54. package/dist/foundations/company/entities/company.meta.d.ts +1 -1
  55. package/dist/foundations/company/entities/company.meta.d.ts.map +1 -1
  56. package/dist/foundations/company/index.d.ts +1 -2
  57. package/dist/foundations/company/index.d.ts.map +1 -1
  58. package/dist/foundations/company/index.js +3 -3
  59. package/dist/foundations/company/index.js.map +1 -1
  60. package/dist/foundations/company/repositories/company.repository.d.ts +26 -1
  61. package/dist/foundations/company/repositories/company.repository.d.ts.map +1 -1
  62. package/dist/foundations/company/repositories/company.repository.js +67 -11
  63. package/dist/foundations/company/repositories/company.repository.js.map +1 -1
  64. package/dist/foundations/company/services/company.service.d.ts +4 -1
  65. package/dist/foundations/company/services/company.service.d.ts.map +1 -1
  66. package/dist/foundations/company/services/company.service.js +11 -6
  67. package/dist/foundations/company/services/company.service.js.map +1 -1
  68. package/dist/foundations/content/entities/content.entity.d.ts +1 -1
  69. package/dist/foundations/content/entities/content.entity.d.ts.map +1 -1
  70. package/dist/foundations/content/serialisers/content.serialiser.js +3 -3
  71. package/dist/foundations/content/serialisers/content.serialiser.js.map +1 -1
  72. package/dist/foundations/module/queries/feature.module.query.d.ts +3 -1
  73. package/dist/foundations/module/queries/feature.module.query.d.ts.map +1 -1
  74. package/dist/foundations/module/queries/feature.module.query.js +27 -15
  75. package/dist/foundations/module/queries/feature.module.query.js.map +1 -1
  76. package/dist/foundations/notification/entities/notification.entity.d.ts +1 -1
  77. package/dist/foundations/notification/entities/notification.entity.d.ts.map +1 -1
  78. package/dist/foundations/notification/serialisers/notifications.serialiser.js +2 -2
  79. package/dist/foundations/notification/serialisers/notifications.serialiser.js.map +1 -1
  80. package/dist/foundations/oauth/entities/oauth.client.entity.d.ts +2 -2
  81. package/dist/foundations/oauth/entities/oauth.client.entity.d.ts.map +1 -1
  82. package/dist/foundations/relevancy/repositories/relevancy.repository.d.ts.map +1 -1
  83. package/dist/foundations/relevancy/repositories/relevancy.repository.js +1 -1
  84. package/dist/foundations/relevancy/repositories/relevancy.repository.js.map +1 -1
  85. package/dist/foundations/relevancy/services/relevancy.service.js +1 -1
  86. package/dist/foundations/relevancy/services/relevancy.service.js.map +1 -1
  87. package/dist/foundations/role/entities/role.d.ts +28 -0
  88. package/dist/foundations/role/entities/role.d.ts.map +1 -0
  89. package/dist/foundations/role/entities/role.js +33 -0
  90. package/dist/foundations/role/entities/role.js.map +1 -0
  91. package/dist/foundations/role/entities/role.meta.d.ts +1 -1
  92. package/dist/foundations/role/entities/role.meta.d.ts.map +1 -1
  93. package/dist/foundations/role/repositories/role.repository.d.ts +1 -1
  94. package/dist/foundations/role/repositories/role.repository.d.ts.map +1 -1
  95. package/dist/foundations/role/repositories/role.repository.js +7 -7
  96. package/dist/foundations/role/repositories/role.repository.js.map +1 -1
  97. package/dist/foundations/role/role.module.d.ts.map +1 -1
  98. package/dist/foundations/role/role.module.js +3 -4
  99. package/dist/foundations/role/role.module.js.map +1 -1
  100. package/dist/foundations/role/services/role.service.js +5 -5
  101. package/dist/foundations/role/services/role.service.js.map +1 -1
  102. package/dist/foundations/stripe-customer/entities/stripe-customer.entity.d.ts +1 -1
  103. package/dist/foundations/stripe-customer/entities/stripe-customer.entity.d.ts.map +1 -1
  104. package/dist/foundations/stripe-price/dtos/stripe-price.dto.d.ts +12 -0
  105. package/dist/foundations/stripe-price/dtos/stripe-price.dto.d.ts.map +1 -1
  106. package/dist/foundations/stripe-price/dtos/stripe-price.dto.js +47 -1
  107. package/dist/foundations/stripe-price/dtos/stripe-price.dto.js.map +1 -1
  108. package/dist/foundations/stripe-price/entities/stripe-price.entity.d.ts +2 -0
  109. package/dist/foundations/stripe-price/entities/stripe-price.entity.d.ts.map +1 -1
  110. package/dist/foundations/stripe-price/entities/stripe-price.map.d.ts.map +1 -1
  111. package/dist/foundations/stripe-price/entities/stripe-price.map.js +1 -0
  112. package/dist/foundations/stripe-price/entities/stripe-price.map.js.map +1 -1
  113. package/dist/foundations/stripe-price/entities/stripe-price.model.d.ts.map +1 -1
  114. package/dist/foundations/stripe-price/entities/stripe-price.model.js +2 -1
  115. package/dist/foundations/stripe-price/entities/stripe-price.model.js.map +1 -1
  116. package/dist/foundations/stripe-price/repositories/stripe-price.repository.d.ts +3 -0
  117. package/dist/foundations/stripe-price/repositories/stripe-price.repository.d.ts.map +1 -1
  118. package/dist/foundations/stripe-price/repositories/stripe-price.repository.js +64 -4
  119. package/dist/foundations/stripe-price/repositories/stripe-price.repository.js.map +1 -1
  120. package/dist/foundations/stripe-price/serialisers/stripe-price.serialiser.d.ts.map +1 -1
  121. package/dist/foundations/stripe-price/serialisers/stripe-price.serialiser.js +5 -0
  122. package/dist/foundations/stripe-price/serialisers/stripe-price.serialiser.js.map +1 -1
  123. package/dist/foundations/stripe-price/services/stripe-price-admin.service.d.ts.map +1 -1
  124. package/dist/foundations/stripe-price/services/stripe-price-admin.service.js +10 -0
  125. package/dist/foundations/stripe-price/services/stripe-price-admin.service.js.map +1 -1
  126. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.d.ts +11 -0
  127. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.d.ts.map +1 -1
  128. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.js +22 -0
  129. package/dist/foundations/stripe-subscription/repositories/stripe-subscription.repository.js.map +1 -1
  130. package/dist/foundations/stripe-subscription/services/feature-sync.service.d.ts +33 -0
  131. package/dist/foundations/stripe-subscription/services/feature-sync.service.d.ts.map +1 -0
  132. package/dist/foundations/stripe-subscription/services/feature-sync.service.js +155 -0
  133. package/dist/foundations/stripe-subscription/services/feature-sync.service.js.map +1 -0
  134. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.d.ts.map +1 -1
  135. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js +11 -0
  136. package/dist/foundations/stripe-subscription/services/stripe-subscription-admin.service.js.map +1 -1
  137. package/dist/foundations/stripe-subscription/stripe-subscription.module.d.ts.map +1 -1
  138. package/dist/foundations/stripe-subscription/stripe-subscription.module.js +3 -0
  139. package/dist/foundations/stripe-subscription/stripe-subscription.module.js.map +1 -1
  140. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.d.ts +3 -1
  141. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.d.ts.map +1 -1
  142. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js +79 -9
  143. package/dist/foundations/stripe-webhook/processors/stripe-webhook.processor.js.map +1 -1
  144. package/dist/foundations/stripe-webhook/services/stripe-webhook-notification.service.d.ts +26 -1
  145. package/dist/foundations/stripe-webhook/services/stripe-webhook-notification.service.d.ts.map +1 -1
  146. package/dist/foundations/stripe-webhook/services/stripe-webhook-notification.service.js +124 -2
  147. package/dist/foundations/stripe-webhook/services/stripe-webhook-notification.service.js.map +1 -1
  148. package/dist/foundations/stripe-webhook/stripe-webhook.module.d.ts.map +1 -1
  149. package/dist/foundations/stripe-webhook/stripe-webhook.module.js +2 -0
  150. package/dist/foundations/stripe-webhook/stripe-webhook.module.js.map +1 -1
  151. package/dist/foundations/tokenusage/entities/tokenusage.entity.d.ts +1 -1
  152. package/dist/foundations/tokenusage/entities/tokenusage.entity.d.ts.map +1 -1
  153. package/dist/foundations/user/controllers/user.controller.d.ts +1 -1
  154. package/dist/foundations/user/controllers/user.controller.d.ts.map +1 -1
  155. package/dist/foundations/user/entities/user.d.ts +124 -0
  156. package/dist/foundations/user/entities/user.d.ts.map +1 -0
  157. package/dist/foundations/user/entities/user.js +81 -0
  158. package/dist/foundations/user/entities/user.js.map +1 -0
  159. package/dist/foundations/user/entities/user.meta.d.ts +1 -1
  160. package/dist/foundations/user/entities/user.meta.d.ts.map +1 -1
  161. package/dist/foundations/user/index.d.ts +1 -4
  162. package/dist/foundations/user/index.d.ts.map +1 -1
  163. package/dist/foundations/user/index.js +6 -23
  164. package/dist/foundations/user/index.js.map +1 -1
  165. package/dist/foundations/user/repositories/user.repository.d.ts +13 -1
  166. package/dist/foundations/user/repositories/user.repository.d.ts.map +1 -1
  167. package/dist/foundations/user/repositories/user.repository.js +85 -21
  168. package/dist/foundations/user/repositories/user.repository.js.map +1 -1
  169. package/dist/foundations/user/services/user.service.d.ts.map +1 -1
  170. package/dist/foundations/user/services/user.service.js +12 -12
  171. package/dist/foundations/user/services/user.service.js.map +1 -1
  172. package/dist/foundations/user/user.module.d.ts.map +1 -1
  173. package/dist/foundations/user/user.module.js +7 -8
  174. package/dist/foundations/user/user.module.js.map +1 -1
  175. package/dist/openapi/factories/entity-schema.factory.js +12 -0
  176. package/dist/openapi/factories/entity-schema.factory.js.map +1 -1
  177. package/dist/openapi/schemas/jsonapi-base.schemas.d.ts +1 -0
  178. package/dist/openapi/schemas/jsonapi-base.schemas.d.ts.map +1 -1
  179. package/dist/openapi/schemas/jsonapi-base.schemas.js.map +1 -1
  180. package/dist/tools/migrate-entity/__tests__/ast-parser.spec.js +331 -0
  181. package/dist/tools/migrate-entity/__tests__/descriptor-generator.spec.js +482 -0
  182. package/dist/tools/migrate-entity/__tests__/file-discovery.spec.js +190 -0
  183. package/dist/tools/migrate-entity/__tests__/integration.spec.js +261 -0
  184. package/dist/tools/migrate-entity/index.js +2 -2
  185. package/dist/tools/migrate-entity/lib/ast-parser.js +255 -10
  186. package/dist/tools/migrate-entity/lib/descriptor-generator.js +384 -55
  187. package/dist/tools/migrate-entity/lib/entity-migrator.js +112 -9
  188. package/dist/tools/migrate-entity/lib/module-updater.js +25 -9
  189. package/dist/tools/migrate-entity/lib/reference-updater.js +110 -24
  190. package/package.json +2 -2
  191. package/dist/foundations/company/entities/company.entity.d.ts +0 -18
  192. package/dist/foundations/company/entities/company.entity.d.ts.map +0 -1
  193. package/dist/foundations/company/entities/company.entity.js +0 -3
  194. package/dist/foundations/company/entities/company.entity.js.map +0 -1
  195. package/dist/foundations/company/entities/company.map.d.ts +0 -8
  196. package/dist/foundations/company/entities/company.map.d.ts.map +0 -1
  197. package/dist/foundations/company/entities/company.map.js +0 -23
  198. package/dist/foundations/company/entities/company.map.js.map +0 -1
  199. package/dist/foundations/company/entities/company.model.d.ts +0 -4
  200. package/dist/foundations/company/entities/company.model.d.ts.map +0 -1
  201. package/dist/foundations/company/entities/company.model.js +0 -17
  202. package/dist/foundations/company/entities/company.model.js.map +0 -1
  203. package/dist/foundations/company/serialisers/company.serialiser.d.ts +0 -14
  204. package/dist/foundations/company/serialisers/company.serialiser.d.ts.map +0 -1
  205. package/dist/foundations/company/serialisers/company.serialiser.js +0 -76
  206. package/dist/foundations/company/serialisers/company.serialiser.js.map +0 -1
  207. package/dist/foundations/role/entities/role.entity.d.ts +0 -9
  208. package/dist/foundations/role/entities/role.entity.d.ts.map +0 -1
  209. package/dist/foundations/role/entities/role.entity.js +0 -3
  210. package/dist/foundations/role/entities/role.entity.js.map +0 -1
  211. package/dist/foundations/role/entities/role.map.d.ts +0 -8
  212. package/dist/foundations/role/entities/role.map.d.ts.map +0 -1
  213. package/dist/foundations/role/entities/role.map.js +0 -15
  214. package/dist/foundations/role/entities/role.map.js.map +0 -1
  215. package/dist/foundations/role/entities/role.model.d.ts +0 -4
  216. package/dist/foundations/role/entities/role.model.d.ts.map +0 -1
  217. package/dist/foundations/role/entities/role.model.js +0 -15
  218. package/dist/foundations/role/entities/role.model.js.map +0 -1
  219. package/dist/foundations/role/serialisers/role.serialiser.d.ts +0 -12
  220. package/dist/foundations/role/serialisers/role.serialiser.d.ts.map +0 -1
  221. package/dist/foundations/role/serialisers/role.serialiser.js +0 -46
  222. package/dist/foundations/role/serialisers/role.serialiser.js.map +0 -1
  223. package/dist/foundations/user/entities/user.entity.d.ts +0 -26
  224. package/dist/foundations/user/entities/user.entity.d.ts.map +0 -1
  225. package/dist/foundations/user/entities/user.entity.js +0 -3
  226. package/dist/foundations/user/entities/user.entity.js.map +0 -1
  227. package/dist/foundations/user/entities/user.map.d.ts +0 -8
  228. package/dist/foundations/user/entities/user.map.d.ts.map +0 -1
  229. package/dist/foundations/user/entities/user.map.js +0 -27
  230. package/dist/foundations/user/entities/user.map.js.map +0 -1
  231. package/dist/foundations/user/entities/user.model.d.ts +0 -7
  232. package/dist/foundations/user/entities/user.model.d.ts.map +0 -1
  233. package/dist/foundations/user/entities/user.model.js +0 -30
  234. package/dist/foundations/user/entities/user.model.js.map +0 -1
  235. package/dist/foundations/user/serialisers/user.serialiser.d.ts +0 -14
  236. package/dist/foundations/user/serialisers/user.serialiser.d.ts.map +0 -1
  237. package/dist/foundations/user/serialisers/user.serialiser.js +0 -80
  238. package/dist/foundations/user/serialisers/user.serialiser.js.map +0 -1
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ /**
3
+ * Descriptor Generator Unit Tests
4
+ *
5
+ * Tests the code generation functions that produce new-style descriptor files.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const vitest_1 = require("vitest");
42
+ const path = __importStar(require("path"));
43
+ const descriptor_generator_1 = require("../lib/descriptor-generator");
44
+ const ast_parser_1 = require("../lib/ast-parser");
45
+ const FIXTURES_DIR = path.resolve(__dirname, "../__fixtures__");
46
+ /**
47
+ * Helper to get parsed entity from test fixtures
48
+ */
49
+ function getParsedTestEntity() {
50
+ const files = {
51
+ entityName: "TestEntity",
52
+ entityDir: path.join(FIXTURES_DIR, "entities"),
53
+ entity: path.join(FIXTURES_DIR, "entities/test-entity.ts"),
54
+ meta: path.join(FIXTURES_DIR, "entities/test-entity.meta.ts"),
55
+ model: path.join(FIXTURES_DIR, "entities/test-entity.model.ts"),
56
+ map: path.join(FIXTURES_DIR, "entities/test-entity.map.ts"),
57
+ serialiser: path.join(FIXTURES_DIR, "entities/test-entity.serialiser.ts"),
58
+ };
59
+ return (0, ast_parser_1.parseOldFiles)(files);
60
+ }
61
+ function getParsedSimpleEntity() {
62
+ const files = {
63
+ entityName: "SimpleEntity",
64
+ entityDir: path.join(FIXTURES_DIR, "simple-entity"),
65
+ entity: path.join(FIXTURES_DIR, "simple-entity/simple-entity.ts"),
66
+ meta: path.join(FIXTURES_DIR, "simple-entity/simple-entity.meta.ts"),
67
+ model: path.join(FIXTURES_DIR, "simple-entity/simple-entity.model.ts"),
68
+ map: path.join(FIXTURES_DIR, "simple-entity/simple-entity.map.ts"),
69
+ serialiser: path.join(FIXTURES_DIR, "simple-entity/simple-entity.serialiser.ts"),
70
+ };
71
+ return (0, ast_parser_1.parseOldFiles)(files);
72
+ }
73
+ function getParsedComplexEntity() {
74
+ const files = {
75
+ entityName: "ComplexEntity",
76
+ entityDir: path.join(FIXTURES_DIR, "complex-entity"),
77
+ entity: path.join(FIXTURES_DIR, "complex-entity/complex-entity.ts"),
78
+ meta: path.join(FIXTURES_DIR, "complex-entity/complex-entity.meta.ts"),
79
+ model: path.join(FIXTURES_DIR, "complex-entity/complex-entity.model.ts"),
80
+ map: path.join(FIXTURES_DIR, "complex-entity/complex-entity.map.ts"),
81
+ serialiser: path.join(FIXTURES_DIR, "complex-entity/complex-entity.serialiser.ts"),
82
+ };
83
+ return (0, ast_parser_1.parseOldFiles)(files);
84
+ }
85
+ /**
86
+ * Helper to get parsed entity with local relationship type imports
87
+ * This tests import type behavior for non-framework relationship types
88
+ */
89
+ function getParsedRelationshipEntity() {
90
+ const files = {
91
+ entityName: "relationship-entity",
92
+ entityDir: path.join(FIXTURES_DIR, "relationship-entity"),
93
+ entity: path.join(FIXTURES_DIR, "relationship-entity/relationship-entity.ts"),
94
+ meta: path.join(FIXTURES_DIR, "relationship-entity/relationship-entity.meta.ts"),
95
+ model: path.join(FIXTURES_DIR, "relationship-entity/relationship-entity.model.ts"),
96
+ map: path.join(FIXTURES_DIR, "relationship-entity/relationship-entity.map.ts"),
97
+ serialiser: path.join(FIXTURES_DIR, "relationship-entity/relationship-entity.serialiser.ts"),
98
+ };
99
+ return (0, ast_parser_1.parseOldFiles)(files);
100
+ }
101
+ (0, vitest_1.describe)("descriptor-generator", () => {
102
+ (0, vitest_1.describe)("generateDescriptor", () => {
103
+ (0, vitest_1.it)("should generate valid TypeScript code", () => {
104
+ const parsed = getParsedTestEntity();
105
+ const entityDir = path.join(FIXTURES_DIR, "entities");
106
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
107
+ (0, vitest_1.expect)(result.code).toContain("export const TestEntityDescriptor = defineEntity<TestEntity>()");
108
+ (0, vitest_1.expect)(result.code).toContain("...testEntityMeta");
109
+ });
110
+ (0, vitest_1.it)("should include injectServices when S3 transforms present", () => {
111
+ const parsed = getParsedTestEntity();
112
+ const entityDir = path.join(FIXTURES_DIR, "entities");
113
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
114
+ (0, vitest_1.expect)(result.code).toContain("injectServices: [S3Service]");
115
+ });
116
+ (0, vitest_1.it)("should exclude injectServices when no transforms", () => {
117
+ const parsed = getParsedSimpleEntity();
118
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
119
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
120
+ (0, vitest_1.expect)(result.code).not.toContain("injectServices");
121
+ });
122
+ (0, vitest_1.it)("should include all fields", () => {
123
+ const parsed = getParsedTestEntity();
124
+ const entityDir = path.join(FIXTURES_DIR, "entities");
125
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
126
+ (0, vitest_1.expect)(result.code).toContain("fields:");
127
+ (0, vitest_1.expect)(result.code).toContain("name:");
128
+ (0, vitest_1.expect)(result.code).toContain("description:");
129
+ (0, vitest_1.expect)(result.code).toContain("url:");
130
+ (0, vitest_1.expect)(result.code).toContain("tags:");
131
+ });
132
+ (0, vitest_1.it)("should include computed fields", () => {
133
+ const parsed = getParsedTestEntity();
134
+ const entityDir = path.join(FIXTURES_DIR, "entities");
135
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
136
+ (0, vitest_1.expect)(result.code).toContain("computed:");
137
+ (0, vitest_1.expect)(result.code).toContain("relevance:");
138
+ (0, vitest_1.expect)(result.code).toContain("itemCount:");
139
+ });
140
+ (0, vitest_1.it)("should include relationships", () => {
141
+ const parsed = getParsedTestEntity();
142
+ const entityDir = path.join(FIXTURES_DIR, "entities");
143
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
144
+ (0, vitest_1.expect)(result.code).toContain("relationships:");
145
+ (0, vitest_1.expect)(result.code).toContain("author:");
146
+ (0, vitest_1.expect)(result.code).toContain('direction: "in"');
147
+ (0, vitest_1.expect)(result.code).toContain('cardinality: "one"');
148
+ });
149
+ (0, vitest_1.it)("should generate correct imports", () => {
150
+ const parsed = getParsedTestEntity();
151
+ const entityDir = path.join(FIXTURES_DIR, "entities");
152
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
153
+ (0, vitest_1.expect)(result.imports.length).toBeGreaterThan(0);
154
+ (0, vitest_1.expect)(result.imports.some((i) => i.includes("defineEntity"))).toBe(true);
155
+ (0, vitest_1.expect)(result.imports.some((i) => i.includes("Entity"))).toBe(true);
156
+ (0, vitest_1.expect)(result.imports.some((i) => i.includes("S3Service"))).toBe(true);
157
+ });
158
+ (0, vitest_1.it)("should not include S3Service in imports when no transforms", () => {
159
+ const parsed = getParsedSimpleEntity();
160
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
161
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
162
+ (0, vitest_1.expect)(result.imports.some((i) => i.includes("S3Service"))).toBe(false);
163
+ });
164
+ (0, vitest_1.it)("should generate type export", () => {
165
+ const parsed = getParsedTestEntity();
166
+ const entityDir = path.join(FIXTURES_DIR, "entities");
167
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
168
+ (0, vitest_1.expect)(result.code).toContain("export type TestEntityDescriptorType = typeof TestEntityDescriptor");
169
+ });
170
+ });
171
+ (0, vitest_1.describe)("generateDescriptor - field configs", () => {
172
+ (0, vitest_1.it)("should create field config with correct type (string)", () => {
173
+ const parsed = getParsedSimpleEntity();
174
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
175
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
176
+ (0, vitest_1.expect)(result.code).toContain('title: { type: "string"');
177
+ });
178
+ (0, vitest_1.it)("should create field config with correct type (number)", () => {
179
+ const parsed = getParsedSimpleEntity();
180
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
181
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
182
+ (0, vitest_1.expect)(result.code).toContain('count: { type: "number"');
183
+ });
184
+ (0, vitest_1.it)("should create field config with correct type (boolean)", () => {
185
+ const parsed = getParsedSimpleEntity();
186
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
187
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
188
+ (0, vitest_1.expect)(result.code).toContain('isActive: { type: "boolean"');
189
+ });
190
+ (0, vitest_1.it)("should create field config with correct type (Date -> datetime)", () => {
191
+ const parsed = getParsedSimpleEntity();
192
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
193
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
194
+ (0, vitest_1.expect)(result.code).toContain('createdAt: { type: "datetime"');
195
+ });
196
+ (0, vitest_1.it)("should create field config with array type (string[])", () => {
197
+ const parsed = getParsedTestEntity();
198
+ const entityDir = path.join(FIXTURES_DIR, "entities");
199
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
200
+ (0, vitest_1.expect)(result.code).toContain('tags: { type: "string[]"');
201
+ });
202
+ (0, vitest_1.it)("should mark required fields", () => {
203
+ const parsed = getParsedTestEntity();
204
+ const entityDir = path.join(FIXTURES_DIR, "entities");
205
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
206
+ (0, vitest_1.expect)(result.code).toContain("required: true");
207
+ });
208
+ (0, vitest_1.it)("should identify meta fields", () => {
209
+ const parsed = getParsedTestEntity();
210
+ const entityDir = path.join(FIXTURES_DIR, "entities");
211
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
212
+ (0, vitest_1.expect)(result.code).toContain("meta: true");
213
+ });
214
+ (0, vitest_1.it)("should add S3 transforms for URL fields", () => {
215
+ const parsed = getParsedTestEntity();
216
+ const entityDir = path.join(FIXTURES_DIR, "entities");
217
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
218
+ // Single URL transform
219
+ (0, vitest_1.expect)(result.code).toContain("url: {");
220
+ (0, vitest_1.expect)(result.code).toContain("transform: async (data, services) => {");
221
+ (0, vitest_1.expect)(result.code).toContain("services.S3Service.generateSignedUrl");
222
+ // Array URL transform
223
+ (0, vitest_1.expect)(result.code).toContain("samplePhotographs: {");
224
+ (0, vitest_1.expect)(result.code).toContain("Promise.all");
225
+ });
226
+ });
227
+ (0, vitest_1.describe)("generateDescriptor - computed configs", () => {
228
+ (0, vitest_1.it)("should create computed config from mapper", () => {
229
+ const parsed = getParsedTestEntity();
230
+ const entityDir = path.join(FIXTURES_DIR, "entities");
231
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
232
+ (0, vitest_1.expect)(result.code).toContain("computed:");
233
+ (0, vitest_1.expect)(result.code).toContain("compute: (params) =>");
234
+ });
235
+ (0, vitest_1.it)("should include params.record.has patterns in computed", () => {
236
+ const parsed = getParsedTestEntity();
237
+ const entityDir = path.join(FIXTURES_DIR, "entities");
238
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
239
+ (0, vitest_1.expect)(result.code).toContain("params.record.has");
240
+ });
241
+ (0, vitest_1.it)("should mark meta computed fields", () => {
242
+ const parsed = getParsedTestEntity();
243
+ const entityDir = path.join(FIXTURES_DIR, "entities");
244
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
245
+ // relevance should have meta: true
246
+ const computedSection = result.code.split("computed:")[1]?.split("relationships:")[0];
247
+ (0, vitest_1.expect)(computedSection).toContain("meta: true");
248
+ });
249
+ });
250
+ (0, vitest_1.describe)("generateDescriptor - relationship configs", () => {
251
+ (0, vitest_1.it)("should use heuristics when Cypher unavailable", () => {
252
+ const parsed = getParsedTestEntity();
253
+ const entityDir = path.join(FIXTURES_DIR, "entities");
254
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
255
+ // author relationship should use heuristic (PUBLISHED)
256
+ (0, vitest_1.expect)(result.code).toContain("author:");
257
+ (0, vitest_1.expect)(result.code).toContain('relationship: "PUBLISHED"');
258
+ });
259
+ (0, vitest_1.it)("should determine cardinality from relationship type", () => {
260
+ const parsed = getParsedTestEntity();
261
+ const entityDir = path.join(FIXTURES_DIR, "entities");
262
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
263
+ // author is a single User, so cardinality should be "one"
264
+ (0, vitest_1.expect)(result.code).toContain('cardinality: "one"');
265
+ });
266
+ (0, vitest_1.it)("should include dtoKey when present", () => {
267
+ const parsed = getParsedComplexEntity();
268
+ const entityDir = path.join(FIXTURES_DIR, "complex-entity");
269
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
270
+ // items has dtoKey in the fixture
271
+ (0, vitest_1.expect)(result.code).toContain('dtoKey: "items"');
272
+ });
273
+ (0, vitest_1.it)("should handle multiple relationships", () => {
274
+ const parsed = getParsedComplexEntity();
275
+ const entityDir = path.join(FIXTURES_DIR, "complex-entity");
276
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
277
+ (0, vitest_1.expect)(result.code).toContain("author:");
278
+ (0, vitest_1.expect)(result.code).toContain("company:");
279
+ (0, vitest_1.expect)(result.code).toContain("items:");
280
+ });
281
+ });
282
+ (0, vitest_1.describe)("generateMetaFile", () => {
283
+ (0, vitest_1.it)("should generate meta file with correct export", () => {
284
+ const meta = {
285
+ type: "test-entities",
286
+ endpoint: "test-entities",
287
+ nodeName: "testEntity",
288
+ labelName: "TestEntity",
289
+ };
290
+ const result = (0, descriptor_generator_1.generateMetaFile)(meta);
291
+ (0, vitest_1.expect)(result).toContain('import { DataMeta } from "@carlonicora/nestjs-neo4jsonapi"');
292
+ (0, vitest_1.expect)(result).toContain("export const testEntityMeta: DataMeta = {");
293
+ (0, vitest_1.expect)(result).toContain('type: "test-entities"');
294
+ (0, vitest_1.expect)(result).toContain('endpoint: "test-entities"');
295
+ (0, vitest_1.expect)(result).toContain('nodeName: "testEntity"');
296
+ (0, vitest_1.expect)(result).toContain('labelName: "TestEntity"');
297
+ });
298
+ (0, vitest_1.it)("should generate meta file for simple-entity", () => {
299
+ const meta = {
300
+ type: "simple-entities",
301
+ endpoint: "simple-entities",
302
+ nodeName: "simpleEntity",
303
+ labelName: "SimpleEntity",
304
+ };
305
+ const result = (0, descriptor_generator_1.generateMetaFile)(meta);
306
+ (0, vitest_1.expect)(result).toContain("export const simpleEntityMeta: DataMeta = {");
307
+ (0, vitest_1.expect)(result).toContain('type: "simple-entities"');
308
+ });
309
+ });
310
+ (0, vitest_1.describe)("generateEntityFile", () => {
311
+ (0, vitest_1.it)("should generate entity file with defineEntity", () => {
312
+ const parsed = getParsedTestEntity();
313
+ const entityDir = path.join(FIXTURES_DIR, "entities");
314
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
315
+ (0, vitest_1.expect)(result).toContain("defineEntity<TestEntity>()");
316
+ });
317
+ (0, vitest_1.it)("should generate complete file structure", () => {
318
+ const parsed = getParsedTestEntity();
319
+ const entityDir = path.join(FIXTURES_DIR, "entities");
320
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
321
+ // Should have imports first
322
+ (0, vitest_1.expect)(result.indexOf("import")).toBeLessThan(result.indexOf("export type TestEntity"));
323
+ // Should have type definition before descriptor
324
+ (0, vitest_1.expect)(result.indexOf("export type TestEntity")).toBeLessThan(result.indexOf("export const TestEntityDescriptor"));
325
+ // Should have descriptor type export at end
326
+ (0, vitest_1.expect)(result).toContain("export type TestEntityDescriptorType");
327
+ });
328
+ (0, vitest_1.it)("should include entity type definition", () => {
329
+ const parsed = getParsedTestEntity();
330
+ const entityDir = path.join(FIXTURES_DIR, "entities");
331
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
332
+ (0, vitest_1.expect)(result).toContain("export type TestEntity = Entity & {");
333
+ (0, vitest_1.expect)(result).toContain("name: string;");
334
+ (0, vitest_1.expect)(result).toContain("description?: string;");
335
+ });
336
+ (0, vitest_1.it)("should generate valid file for simple-entity", () => {
337
+ const parsed = getParsedSimpleEntity();
338
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
339
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
340
+ (0, vitest_1.expect)(result).toContain("export const SimpleEntityDescriptor = defineEntity<SimpleEntity>()");
341
+ (0, vitest_1.expect)(result).toContain("...simpleEntityMeta");
342
+ (0, vitest_1.expect)(result).not.toContain("injectServices");
343
+ (0, vitest_1.expect)(result).not.toContain("S3Service");
344
+ });
345
+ (0, vitest_1.it)("should generate valid file for complex-entity with relationships", () => {
346
+ const parsed = getParsedComplexEntity();
347
+ const entityDir = path.join(FIXTURES_DIR, "complex-entity");
348
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
349
+ (0, vitest_1.expect)(result).toContain("export const ComplexEntityDescriptor = defineEntity<ComplexEntity>()");
350
+ (0, vitest_1.expect)(result).toContain("relationships:");
351
+ (0, vitest_1.expect)(result).toContain("author:");
352
+ (0, vitest_1.expect)(result).toContain("company:");
353
+ (0, vitest_1.expect)(result).toContain("items:");
354
+ });
355
+ });
356
+ (0, vitest_1.describe)("S3 transform code generation", () => {
357
+ (0, vitest_1.it)("should generate single URL transform correctly", () => {
358
+ const parsed = getParsedTestEntity();
359
+ const entityDir = path.join(FIXTURES_DIR, "entities");
360
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
361
+ // Check for single URL transform pattern with tilde prefix handling
362
+ (0, vitest_1.expect)(result.code).toContain("if (!data.url) return undefined;");
363
+ (0, vitest_1.expect)(result.code).toContain('if (data.url.startsWith("~")) return data.url.substring(1);');
364
+ (0, vitest_1.expect)(result.code).toContain("services.S3Service.generateSignedUrl({ key: data.url, isPublic: true })");
365
+ });
366
+ (0, vitest_1.it)("should generate array URL transform correctly", () => {
367
+ const parsed = getParsedTestEntity();
368
+ const entityDir = path.join(FIXTURES_DIR, "entities");
369
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
370
+ // Check for array URL transform pattern with tilde prefix handling
371
+ (0, vitest_1.expect)(result.code).toContain("if (!data.samplePhotographs?.length) return [];");
372
+ (0, vitest_1.expect)(result.code).toContain("data.samplePhotographs.map(async (url: string) => {");
373
+ (0, vitest_1.expect)(result.code).toContain('if (url.startsWith("~")) return url.substring(1);');
374
+ (0, vitest_1.expect)(result.code).toContain("services.S3Service.generateSignedUrl({ key: url, isPublic: true })");
375
+ });
376
+ });
377
+ /**
378
+ * Tests for circular dependency prevention
379
+ *
380
+ * These tests verify that the generated code avoids circular dependencies by:
381
+ * 1. Using internal imports (../../../common) instead of package barrel (@carlonicora/nestjs-neo4jsonapi)
382
+ * 2. Using "import type" for relationship type imports that would otherwise cause runtime circular deps
383
+ */
384
+ (0, vitest_1.describe)("circular dependency prevention - internal imports", () => {
385
+ (0, vitest_1.it)("should use internal import path instead of package barrel for framework imports", () => {
386
+ const parsed = getParsedTestEntity();
387
+ const entityDir = path.join(FIXTURES_DIR, "entities");
388
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
389
+ // Framework imports should use internal path to avoid circular dependency
390
+ // when the package barrel re-exports from ./foundations
391
+ const frameworkImport = result.imports.find((i) => i.includes("defineEntity"));
392
+ (0, vitest_1.expect)(frameworkImport).toBeDefined();
393
+ (0, vitest_1.expect)(frameworkImport).toContain('from "../../../common"');
394
+ (0, vitest_1.expect)(frameworkImport).not.toContain("@carlonicora/nestjs-neo4jsonapi");
395
+ });
396
+ (0, vitest_1.it)("should include Entity in internal imports", () => {
397
+ const parsed = getParsedTestEntity();
398
+ const entityDir = path.join(FIXTURES_DIR, "entities");
399
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
400
+ const frameworkImport = result.imports.find((i) => i.includes("../../../common"));
401
+ (0, vitest_1.expect)(frameworkImport).toBeDefined();
402
+ (0, vitest_1.expect)(frameworkImport).toContain("Entity");
403
+ });
404
+ (0, vitest_1.it)("should include S3Service in separate import when transforms are used", () => {
405
+ const parsed = getParsedTestEntity();
406
+ const entityDir = path.join(FIXTURES_DIR, "entities");
407
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
408
+ // S3Service has its own module, so it should be imported separately (not from ../../../common)
409
+ const s3Import = result.imports.find((i) => i.includes("S3Service"));
410
+ (0, vitest_1.expect)(s3Import).toBeDefined();
411
+ (0, vitest_1.expect)(s3Import).toContain('from "../../s3"');
412
+ });
413
+ (0, vitest_1.it)("should NOT include S3Service in internal imports when no transforms", () => {
414
+ const parsed = getParsedSimpleEntity();
415
+ const entityDir = path.join(FIXTURES_DIR, "simple-entity");
416
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
417
+ const frameworkImport = result.imports.find((i) => i.includes("../../../common"));
418
+ (0, vitest_1.expect)(frameworkImport).toBeDefined();
419
+ (0, vitest_1.expect)(frameworkImport).not.toContain("S3Service");
420
+ });
421
+ (0, vitest_1.it)("should generate internal imports for entity file", () => {
422
+ const parsed = getParsedTestEntity();
423
+ const entityDir = path.join(FIXTURES_DIR, "entities");
424
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
425
+ // Verify the full file uses internal imports
426
+ (0, vitest_1.expect)(result).toContain('from "../../../common"');
427
+ (0, vitest_1.expect)(result).not.toMatch(/from ["']@carlonicora\/nestjs-neo4jsonapi["']/);
428
+ });
429
+ });
430
+ (0, vitest_1.describe)("circular dependency prevention - import type for relationship types", () => {
431
+ (0, vitest_1.it)("should use import type for non-framework relationship type imports", () => {
432
+ const parsed = getParsedRelationshipEntity();
433
+ const entityDir = path.join(FIXTURES_DIR, "relationship-entity");
434
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
435
+ // Find imports for Feature and Module (non-framework types)
436
+ const featureImport = result.imports.find((i) => i.includes("Feature"));
437
+ const moduleImport = result.imports.find((i) => i.includes("Module"));
438
+ // Both should use "import type" to avoid runtime circular dependencies
439
+ if (featureImport) {
440
+ (0, vitest_1.expect)(featureImport).toMatch(/^import type\s/);
441
+ }
442
+ if (moduleImport) {
443
+ (0, vitest_1.expect)(moduleImport).toMatch(/^import type\s/);
444
+ }
445
+ });
446
+ (0, vitest_1.it)("should convert regular imports to import type for local entity files", () => {
447
+ const parsed = getParsedRelationshipEntity();
448
+ const entityDir = path.join(FIXTURES_DIR, "relationship-entity");
449
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
450
+ // The generated file should have import type for Feature and Module
451
+ // These are only used in the type definition, not at runtime
452
+ const lines = result.split("\n");
453
+ const importLines = lines.filter((l) => l.includes("import") && (l.includes("Feature") || l.includes("Module")));
454
+ for (const importLine of importLines) {
455
+ // Skip framework imports which don't need import type
456
+ if (!importLine.includes("../../../common")) {
457
+ (0, vitest_1.expect)(importLine).toMatch(/^import type\s/);
458
+ }
459
+ }
460
+ });
461
+ (0, vitest_1.it)("should NOT use import type for framework types (User, Company)", () => {
462
+ const parsed = getParsedTestEntity();
463
+ const entityDir = path.join(FIXTURES_DIR, "entities");
464
+ const result = (0, descriptor_generator_1.generateDescriptor)(parsed, entityDir);
465
+ // Framework types like User and Company are included in the main internal import
466
+ // which is a regular import (not import type) because defineEntity is also needed at runtime
467
+ const frameworkImport = result.imports.find((i) => i.includes("../../../common"));
468
+ (0, vitest_1.expect)(frameworkImport).toBeDefined();
469
+ // This should be a regular import, not import type
470
+ (0, vitest_1.expect)(frameworkImport).not.toMatch(/^import type\s/);
471
+ });
472
+ (0, vitest_1.it)("should generate valid file for relationship-entity", () => {
473
+ const parsed = getParsedRelationshipEntity();
474
+ const entityDir = path.join(FIXTURES_DIR, "relationship-entity");
475
+ const result = (0, descriptor_generator_1.generateEntityFile)(parsed, entityDir);
476
+ (0, vitest_1.expect)(result).toContain("export const RelationshipEntityDescriptor = defineEntity<RelationshipEntity>()");
477
+ (0, vitest_1.expect)(result).toContain("relationships:");
478
+ (0, vitest_1.expect)(result).toContain("feature:");
479
+ (0, vitest_1.expect)(result).toContain("module:");
480
+ });
481
+ });
482
+ });