@spytecgps/nova-orm 0.0.3 → 0.0.5

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 (154) hide show
  1. package/README.md +2 -0
  2. package/dist/entities/alert.d.ts +25 -0
  3. package/dist/entities/alert.js +118 -0
  4. package/dist/entities/alertType.d.ts +14 -0
  5. package/dist/entities/alertType.js +65 -0
  6. package/dist/entities/assetCategory.d.ts +5 -0
  7. package/dist/entities/assetCategory.js +29 -0
  8. package/dist/entities/billing.d.ts +15 -0
  9. package/dist/entities/billing.js +81 -0
  10. package/dist/entities/billingCustomerBraintree.d.ts +11 -0
  11. package/dist/entities/billingCustomerBraintree.js +53 -0
  12. package/dist/entities/billingDeviceHistory.d.ts +11 -0
  13. package/dist/entities/billingDeviceHistory.js +52 -0
  14. package/dist/entities/billingStatusHistoryBraintree.d.ts +10 -0
  15. package/dist/entities/billingStatusHistoryBraintree.js +55 -0
  16. package/dist/entities/billingSubscriptionBraintree.d.ts +34 -0
  17. package/dist/entities/billingSubscriptionBraintree.js +169 -0
  18. package/dist/entities/blacklist.d.ts +9 -0
  19. package/dist/entities/blacklist.js +44 -0
  20. package/dist/entities/blacklistType.d.ts +5 -0
  21. package/dist/entities/blacklistType.js +28 -0
  22. package/dist/entities/cellTower.d.ts +12 -0
  23. package/dist/entities/cellTower.js +56 -0
  24. package/dist/entities/client.d.ts +22 -0
  25. package/dist/entities/client.js +96 -0
  26. package/dist/entities/clientConfiguration.d.ts +7 -0
  27. package/dist/entities/clientConfiguration.js +42 -0
  28. package/dist/entities/clientDeviceSetting.d.ts +14 -0
  29. package/dist/entities/clientDeviceSetting.js +76 -0
  30. package/dist/entities/clientType.d.ts +6 -0
  31. package/dist/entities/clientType.js +32 -0
  32. package/dist/entities/country.d.ts +16 -0
  33. package/dist/entities/country.js +76 -0
  34. package/dist/entities/dataSourceType.d.ts +5 -0
  35. package/dist/entities/dataSourceType.js +28 -0
  36. package/dist/entities/deactivation.d.ts +12 -0
  37. package/dist/entities/deactivation.js +63 -0
  38. package/dist/entities/deactivationReason.d.ts +6 -0
  39. package/dist/entities/deactivationReason.js +36 -0
  40. package/dist/entities/device.d.ts +31 -0
  41. package/dist/entities/device.js +123 -0
  42. package/dist/entities/deviceBehavior.d.ts +22 -0
  43. package/dist/entities/deviceBehavior.js +105 -0
  44. package/dist/entities/deviceHistory.d.ts +9 -0
  45. package/dist/entities/deviceHistory.js +44 -0
  46. package/dist/entities/deviceModelListener.d.ts +8 -0
  47. package/dist/entities/deviceModelListener.js +40 -0
  48. package/dist/entities/deviceReplacement.d.ts +11 -0
  49. package/dist/entities/deviceReplacement.js +49 -0
  50. package/dist/entities/deviceType.d.ts +23 -0
  51. package/dist/entities/deviceType.js +100 -0
  52. package/dist/entities/deviceTypeEvent.d.ts +5 -0
  53. package/dist/entities/deviceTypeEvent.js +29 -0
  54. package/dist/entities/deviceTypeFeature.d.ts +5 -0
  55. package/dist/entities/deviceTypeFeature.js +29 -0
  56. package/dist/entities/deviceTypeFirmware.d.ts +11 -0
  57. package/dist/entities/deviceTypeFirmware.js +57 -0
  58. package/dist/entities/entityTag.d.ts +8 -0
  59. package/dist/entities/entityTag.js +42 -0
  60. package/dist/entities/entityType.d.ts +5 -0
  61. package/dist/entities/entityType.js +28 -0
  62. package/dist/entities/event.d.ts +6 -0
  63. package/dist/entities/event.js +32 -0
  64. package/dist/entities/feature.d.ts +6 -0
  65. package/dist/entities/feature.js +32 -0
  66. package/dist/entities/firmwareUpgradeTask.d.ts +12 -0
  67. package/dist/entities/firmwareUpgradeTask.js +53 -0
  68. package/dist/entities/geofence.d.ts +20 -0
  69. package/dist/entities/geofence.js +86 -0
  70. package/dist/entities/geofenceEvent.d.ts +19 -0
  71. package/dist/entities/geofenceEvent.js +87 -0
  72. package/dist/entities/imeiIccidCarrier.d.ts +16 -0
  73. package/dist/entities/imeiIccidCarrier.js +78 -0
  74. package/dist/entities/imeiIccidHistory.d.ts +7 -0
  75. package/dist/entities/imeiIccidHistory.js +38 -0
  76. package/dist/entities/index.d.ts +68 -0
  77. package/dist/entities/index.js +68 -0
  78. package/dist/entities/industry.d.ts +8 -0
  79. package/dist/entities/industry.js +40 -0
  80. package/dist/entities/mobileNetwork.d.ts +9 -0
  81. package/dist/entities/mobileNetwork.js +44 -0
  82. package/dist/entities/notificationRecipient.d.ts +14 -0
  83. package/dist/entities/notificationRecipient.js +70 -0
  84. package/dist/entities/organization.d.ts +9 -0
  85. package/dist/entities/organization.js +40 -0
  86. package/dist/entities/plan.d.ts +16 -0
  87. package/dist/entities/plan.js +72 -0
  88. package/dist/entities/position.d.ts +18 -0
  89. package/dist/entities/position.js +84 -0
  90. package/dist/entities/securityRole.d.ts +7 -0
  91. package/dist/entities/securityRole.js +36 -0
  92. package/dist/entities/serviceProvider.d.ts +7 -0
  93. package/dist/entities/serviceProvider.js +36 -0
  94. package/dist/entities/serviceProviderProduct.d.ts +9 -0
  95. package/dist/entities/serviceProviderProduct.js +54 -0
  96. package/dist/entities/serviceProviderProductNetwork.d.ts +5 -0
  97. package/dist/entities/serviceProviderProductNetwork.js +28 -0
  98. package/dist/entities/serviceProviderProductType.d.ts +5 -0
  99. package/dist/entities/serviceProviderProductType.js +28 -0
  100. package/dist/entities/sim.d.ts +16 -0
  101. package/dist/entities/sim.js +78 -0
  102. package/dist/entities/trip.d.ts +24 -0
  103. package/dist/entities/trip.js +103 -0
  104. package/dist/entities/tripCompletionStatus.d.ts +6 -0
  105. package/dist/entities/tripCompletionStatus.js +32 -0
  106. package/dist/entities/tripPosition.d.ts +4 -0
  107. package/dist/entities/tripPosition.js +24 -0
  108. package/dist/entities/user.d.ts +25 -0
  109. package/dist/entities/user.js +116 -0
  110. package/dist/entities/userActivation.d.ts +9 -0
  111. package/dist/entities/userActivation.js +45 -0
  112. package/dist/entities/userActivationDevice.d.ts +22 -0
  113. package/dist/entities/userActivationDevice.js +105 -0
  114. package/dist/entities/userActivationEvent.d.ts +12 -0
  115. package/dist/entities/userActivationEvent.js +52 -0
  116. package/dist/entities/userActivationMetric.d.ts +38 -0
  117. package/dist/entities/userActivationMetric.js +167 -0
  118. package/dist/entities/userAlertConfiguration.d.ts +13 -0
  119. package/dist/entities/userAlertConfiguration.js +68 -0
  120. package/dist/entities/userAppFeedback.d.ts +10 -0
  121. package/dist/entities/userAppFeedback.js +45 -0
  122. package/dist/entities/userAppIncident.d.ts +29 -0
  123. package/dist/entities/userAppIncident.js +131 -0
  124. package/dist/entities/userConfiguration.d.ts +18 -0
  125. package/dist/entities/userConfiguration.js +87 -0
  126. package/dist/entities/userDataDeletionRequest.d.ts +11 -0
  127. package/dist/entities/userDataDeletionRequest.js +48 -0
  128. package/dist/entities/userDeviceBehaviorTask.d.ts +14 -0
  129. package/dist/entities/userDeviceBehaviorTask.js +61 -0
  130. package/dist/entities/userInvitation.d.ts +17 -0
  131. package/dist/entities/userInvitation.js +75 -0
  132. package/dist/entities/userRatingRequest.d.ts +13 -0
  133. package/dist/entities/userRatingRequest.js +63 -0
  134. package/dist/entities/userRegistrationAttempt.d.ts +35 -0
  135. package/dist/entities/userRegistrationAttempt.js +145 -0
  136. package/dist/entities/userSecurityRole.d.ts +6 -0
  137. package/dist/entities/userSecurityRole.js +30 -0
  138. package/dist/index.d.ts +5 -0
  139. package/dist/index.js +5 -0
  140. package/dist/novaDataSource.d.ts +56 -0
  141. package/dist/novaDataSource.js +59 -0
  142. package/dist/repositories/baseRepository.d.ts +5 -0
  143. package/dist/repositories/baseRepository.js +5 -0
  144. package/dist/repositories/devicesRepository.d.ts +24 -0
  145. package/dist/repositories/devicesRepository.js +122 -0
  146. package/dist/repositories/index.d.ts +3 -0
  147. package/dist/repositories/index.js +3 -0
  148. package/dist/repositories/securityRepository.d.ts +21 -0
  149. package/dist/repositories/securityRepository.js +99 -0
  150. package/dist/types/enums.d.ts +9 -0
  151. package/dist/types/enums.js +11 -0
  152. package/dist/utils/uuidHelpers.d.ts +2 -0
  153. package/dist/utils/uuidHelpers.js +6 -0
  154. package/package.json +11 -11
@@ -0,0 +1,122 @@
1
+ // import { logger } from '@spytecgps/sdk'
2
+ import { Device, DeviceType, ImeiIccidCarrier } from '../entities';
3
+ import { NovaDataSource } from '../novaDataSource';
4
+ import { DeviceStatus } from '../types/enums';
5
+ import { BaseRepository } from './baseRepository';
6
+ export class DevicesRepository extends BaseRepository {
7
+ /**
8
+ * Get device by imei
9
+ * @param {string} imei The imei of the device
10
+ */
11
+ async getDeviceByImei(imei, options) {
12
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
13
+ try {
14
+ await novaDataSource.connect();
15
+ const devicesRepository = novaDataSource.getRepository(Device);
16
+ let device = null;
17
+ if (!options.withDeviceType && !options.withIccidCarrier) {
18
+ device = await devicesRepository.findOne({ where: { imei } });
19
+ }
20
+ else {
21
+ let queryBuilder = devicesRepository.createQueryBuilder('device');
22
+ if (options.withDeviceType) {
23
+ queryBuilder = queryBuilder.leftJoinAndMapOne('device.deviceType', DeviceType, 'deviceType', 'device.deviceTypeId = deviceType.id');
24
+ }
25
+ if (options.withIccidCarrier) {
26
+ queryBuilder = queryBuilder.leftJoinAndMapOne('device.iccidCarrier', ImeiIccidCarrier, 'iccidCarrier', 'device.imei = iccidCarrier.imei');
27
+ }
28
+ device = await queryBuilder.where('device.imei = :imei', { imei }).getOne();
29
+ }
30
+ return device;
31
+ }
32
+ catch (error) {
33
+ // TODO: Add logger
34
+ // logger.error({ error }, 'DevicesRepository::getDeviceByImei error')
35
+ throw error;
36
+ }
37
+ finally {
38
+ await novaDataSource.disconnect();
39
+ }
40
+ }
41
+ /**
42
+ * Get devices by type id
43
+ * @param {number} deviceTypeId The device type id
44
+ * @param {boolean} onlyActiveDevices Whether to get only active devices
45
+ */
46
+ async getDevicesByDeviceTypeId(deviceTypeId, onlyActiveDevices, options) {
47
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
48
+ try {
49
+ await novaDataSource.connect();
50
+ const devicesRepository = novaDataSource.getRepository(Device);
51
+ let devices = null;
52
+ if (!options.withDeviceType && !options.withIccidCarrier) {
53
+ const filterCondition = onlyActiveDevices
54
+ ? { where: { deviceTypeId, status: DeviceStatus.Active } }
55
+ : {
56
+ where: { deviceTypeId },
57
+ };
58
+ devices = await devicesRepository.find(filterCondition);
59
+ }
60
+ else {
61
+ let queryBuilder = devicesRepository.createQueryBuilder('device');
62
+ if (options.withDeviceType) {
63
+ queryBuilder = queryBuilder.leftJoinAndMapOne('device.deviceType', DeviceType, 'deviceType', 'device.deviceTypeId = deviceType.id');
64
+ }
65
+ if (options.withIccidCarrier) {
66
+ queryBuilder = queryBuilder.leftJoinAndMapOne('device.iccidCarrier', ImeiIccidCarrier, 'iccidCarrier', 'device.imei = iccidCarrier.imei');
67
+ }
68
+ queryBuilder = queryBuilder.where('device.deviceTypeId = :deviceTypeId', { deviceTypeId });
69
+ if (onlyActiveDevices) {
70
+ queryBuilder = queryBuilder.andWhere('device.status = :status', {
71
+ status: DeviceStatus.Active,
72
+ });
73
+ }
74
+ devices = await queryBuilder.getMany();
75
+ }
76
+ return devices;
77
+ }
78
+ catch (error) {
79
+ // TODO: Add logger
80
+ // logger.error({ error }, 'DevicesRepository::getDeviceByImei error')
81
+ throw error;
82
+ }
83
+ finally {
84
+ await novaDataSource.disconnect();
85
+ }
86
+ }
87
+ /**
88
+ * Get device types
89
+ * @param {boolean} onlyWithRelatedIccidCarrier Whether to get only device types with iccid carrier
90
+ */
91
+ async getDeviceTypes(onlyWithRelatedIccidCarrier) {
92
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
93
+ try {
94
+ await novaDataSource.connect();
95
+ const deviceTypesRepository = novaDataSource.getRepository(DeviceType);
96
+ let deviceTypes = null;
97
+ if (!onlyWithRelatedIccidCarrier) {
98
+ deviceTypes = await deviceTypesRepository
99
+ .createQueryBuilder('deviceType')
100
+ .orderBy('deviceType.id')
101
+ .getMany();
102
+ }
103
+ else {
104
+ deviceTypes = await deviceTypesRepository
105
+ .createQueryBuilder('deviceType')
106
+ .innerJoin(ImeiIccidCarrier, 'iccidCarrier', 'deviceType.id = iccidCarrier.deviceTypeId')
107
+ .groupBy('deviceType.id')
108
+ .orderBy('deviceType.id')
109
+ .getMany();
110
+ }
111
+ return deviceTypes;
112
+ }
113
+ catch (error) {
114
+ // TODO: Add logger
115
+ // logger.error({ error }, 'DevicesRepository::getDeviceTypes error')
116
+ throw error;
117
+ }
118
+ finally {
119
+ await novaDataSource.disconnect();
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,3 @@
1
+ import { DevicesRepository } from './devicesRepository';
2
+ import { SecurityRepository } from './securityRepository';
3
+ export { SecurityRepository, DevicesRepository };
@@ -0,0 +1,3 @@
1
+ import { DevicesRepository } from './devicesRepository';
2
+ import { SecurityRepository } from './securityRepository';
3
+ export { SecurityRepository, DevicesRepository };
@@ -0,0 +1,21 @@
1
+ import { SecurityRole, UserSecurityRole } from '../entities';
2
+ import { HapnSecurityRole } from '../types/enums';
3
+ import { BaseRepository } from './baseRepository';
4
+ export declare class SecurityRepository extends BaseRepository {
5
+ /**
6
+ * Get all security roles
7
+ */
8
+ getAllRoles(): Promise<SecurityRole[]>;
9
+ /**
10
+ * Get roles of the user
11
+ */
12
+ getUserRoles(userId: string): Promise<UserSecurityRole[]>;
13
+ /**
14
+ * Get user roles by clientId
15
+ */
16
+ getUserRolesByClientId(clientId: number, filterRole?: HapnSecurityRole): Promise<UserSecurityRole[]>;
17
+ /**
18
+ * Whether the user is in role
19
+ */
20
+ isInRole(userId: string, role: HapnSecurityRole): Promise<boolean>;
21
+ }
@@ -0,0 +1,99 @@
1
+ // import { logger } from '@spytecgps/sdk'
2
+ import { SecurityRole, UserSecurityRole } from '../entities';
3
+ import { NovaDataSource } from '../novaDataSource';
4
+ import { uuidStringToBinaryBuffer } from '../utils/uuidHelpers';
5
+ import { BaseRepository } from './baseRepository';
6
+ export class SecurityRepository extends BaseRepository {
7
+ /**
8
+ * Get all security roles
9
+ */
10
+ async getAllRoles() {
11
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
12
+ try {
13
+ await novaDataSource.connect();
14
+ const rolesRepository = novaDataSource.getRepository(SecurityRole);
15
+ const roles = await rolesRepository.find();
16
+ return roles;
17
+ }
18
+ catch (error) {
19
+ // TODO: Add logger
20
+ // logger.error({ error }, 'SecurityRepository::getAllRoles error')
21
+ throw error;
22
+ }
23
+ finally {
24
+ await novaDataSource.disconnect();
25
+ }
26
+ }
27
+ /**
28
+ * Get roles of the user
29
+ */
30
+ async getUserRoles(userId) {
31
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
32
+ try {
33
+ await novaDataSource.connect();
34
+ const userSecurityRolesRepository = novaDataSource.getRepository(UserSecurityRole);
35
+ const userRoles = await userSecurityRolesRepository.find({
36
+ where: { userId: uuidStringToBinaryBuffer(userId) },
37
+ });
38
+ return userRoles;
39
+ }
40
+ catch (error) {
41
+ // TODO: Add logger
42
+ // logger.error({ error }, 'SecurityRepository::getUserRoles error')
43
+ throw error;
44
+ }
45
+ finally {
46
+ await novaDataSource.disconnect();
47
+ }
48
+ }
49
+ /**
50
+ * Get user roles by clientId
51
+ */
52
+ async getUserRolesByClientId(clientId, filterRole = null) {
53
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
54
+ try {
55
+ await novaDataSource.connect();
56
+ const userSecurityRolesRepository = novaDataSource.getRepository(UserSecurityRole);
57
+ const filterCondition = filterRole
58
+ ? { where: { clientId, securityRoleId: filterRole } }
59
+ : {
60
+ where: { clientId },
61
+ };
62
+ const userRoles = await userSecurityRolesRepository.find(filterCondition);
63
+ return userRoles;
64
+ }
65
+ catch (error) {
66
+ // TODO: Add logger
67
+ // logger.error({ error }, 'SecurityRepository::getUserRolesByClientId error')
68
+ throw error;
69
+ }
70
+ finally {
71
+ await novaDataSource.disconnect();
72
+ }
73
+ }
74
+ /**
75
+ * Whether the user is in role
76
+ */
77
+ async isInRole(userId, role) {
78
+ const novaDataSource = new NovaDataSource(this.novaDataSourceConfig);
79
+ try {
80
+ await novaDataSource.connect();
81
+ const userSecurityRolesRepository = novaDataSource.getRepository(UserSecurityRole);
82
+ const userRole = await userSecurityRolesRepository.findOne({
83
+ where: {
84
+ userId: uuidStringToBinaryBuffer(userId),
85
+ securityRoleId: role,
86
+ },
87
+ });
88
+ return userRole !== null;
89
+ }
90
+ catch (error) {
91
+ // TODO: Add logger
92
+ // logger.error({ error }, 'SecurityRepository::isAdmin error')
93
+ throw error;
94
+ }
95
+ finally {
96
+ await novaDataSource.disconnect();
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,9 @@
1
+ export declare enum HapnSecurityRole {
2
+ Admin = 1,
3
+ Collaborator = 2,
4
+ Owner = 3
5
+ }
6
+ export declare enum DeviceStatus {
7
+ Active = "A",
8
+ Deleted = "D"
9
+ }
@@ -0,0 +1,11 @@
1
+ export var HapnSecurityRole;
2
+ (function (HapnSecurityRole) {
3
+ HapnSecurityRole[HapnSecurityRole["Admin"] = 1] = "Admin";
4
+ HapnSecurityRole[HapnSecurityRole["Collaborator"] = 2] = "Collaborator";
5
+ HapnSecurityRole[HapnSecurityRole["Owner"] = 3] = "Owner";
6
+ })(HapnSecurityRole || (HapnSecurityRole = {}));
7
+ export var DeviceStatus;
8
+ (function (DeviceStatus) {
9
+ DeviceStatus["Active"] = "A";
10
+ DeviceStatus["Deleted"] = "D";
11
+ })(DeviceStatus || (DeviceStatus = {}));
@@ -0,0 +1,2 @@
1
+ /// <reference types="node" />
2
+ export declare const uuidStringToBinaryBuffer: (uuidString: string) => Buffer;
@@ -0,0 +1,6 @@
1
+ export const uuidStringToBinaryBuffer = (uuidString) => {
2
+ if (!uuidString) {
3
+ return null;
4
+ }
5
+ return Buffer.from(uuidString.replace(/-/g, ''), 'hex');
6
+ };
package/package.json CHANGED
@@ -1,44 +1,44 @@
1
1
  {
2
2
  "name": "@spytecgps/nova-orm",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "ORM with PlanetScale",
5
- "main": "dist/index.js",
5
+ "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "devDependencies": {
8
8
  "@types/jest": "^29.5.1",
9
- "@types/node": "^18.15.11",
9
+ "@types/node": "^14.18.36",
10
10
  "@typescript-eslint/eslint-plugin": "^5.59.0",
11
11
  "@typescript-eslint/parser": "^5.59.0",
12
12
  "aws-sdk": "^2.877.0",
13
+ "axios": "^1.4.0",
13
14
  "eslint": "^8.38.0",
14
15
  "eslint-config-prettier": "^6.15.0",
15
16
  "eslint-plugin-import": "^2.27.5",
16
17
  "eslint-plugin-prettier": "^3.4.1",
17
18
  "eslint-plugin-simple-import-sort": "^10.0.0",
18
19
  "jest": "^29.3.1",
19
- "jest-junit": "^14.0.1",
20
+ "jest-junit": "^12.0.0",
20
21
  "prettier": "^1.19.1",
21
22
  "ts-jest": "^29.0.5",
22
23
  "ts-loader": "^9.4.1",
23
24
  "ts-node": "^10.9.1",
24
- "typescript": "^5.0.4",
25
- "webpack-cli": "^5.0.2",
26
- "webpack": "^5.80.0"
25
+ "typescript": "^4.9.5",
26
+ "webpack": "^5.72.0",
27
+ "webpack-cli": "^4.9.2"
27
28
  },
28
29
  "dependencies": {
29
- "@spytecgps/sdk": "^0.5.97",
30
30
  "mysql2": "^3.2.3",
31
31
  "reflect-metadata": "^0.1.13",
32
32
  "typeorm": "0.3.15"
33
33
  },
34
34
  "scripts": {
35
- "test": "jest --ci --runInBand --reporters=default --reporters=jest-junit --collectCoverage=true",
36
- "start": "ts-node src/index.ts",
35
+ "prepare": "npm run build",
36
+ "test": "yarn jest --ci --runInBand --reporters=default --reporters=jest-junit --collectCoverage=true",
37
37
  "typeorm": "typeorm-ts-node-commonjs",
38
38
  "lint": "eslint \"./src/**\"",
39
39
  "lint-fix": "eslint \"./src/**\" --fix",
40
40
  "build-dev": "webpack --mode=development",
41
- "build": "webpack --mode=production",
41
+ "build": "tsc",
42
42
  "schema-sync": "yarn typeorm schema:drop --dataSource ./data-source.ts & yarn typeorm schema:sync --dataSource ./data-source.ts"
43
43
  },
44
44
  "author": "Spytec",