@laboratory-one/api-components 0.0.20 → 0.0.22

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 (108) hide show
  1. package/dist/cjs/cron/cron.util.d.ts.map +1 -1
  2. package/dist/cjs/guard/auth.guard.d.ts.map +1 -1
  3. package/dist/cjs/guard/auth.guard.js.map +1 -1
  4. package/dist/cjs/health/dtos/health.response.dto.d.ts +1 -0
  5. package/dist/cjs/health/dtos/health.response.dto.d.ts.map +1 -1
  6. package/dist/cjs/health/dtos/health.response.dto.js +5 -0
  7. package/dist/cjs/health/dtos/health.response.dto.js.map +1 -1
  8. package/dist/cjs/health/health.service.d.ts +1 -1
  9. package/dist/cjs/health/health.service.d.ts.map +1 -1
  10. package/dist/cjs/health/health.service.js +4 -1
  11. package/dist/cjs/health/health.service.js.map +1 -1
  12. package/dist/cjs/middleware/logger.middleware.d.ts.map +1 -1
  13. package/dist/cjs/middleware/logger.middleware.js.map +1 -1
  14. package/dist/cjs/prisma/prisma.service.d.ts.map +1 -1
  15. package/dist/cjs/prisma/prisma.service.js.map +1 -1
  16. package/dist/cjs/search/search.service.d.ts +1 -1
  17. package/dist/cjs/search/search.service.d.ts.map +1 -1
  18. package/dist/cjs/search/search.service.js +24 -14
  19. package/dist/cjs/search/search.service.js.map +1 -1
  20. package/dist/cjs/services/instrument-sentry.d.ts.map +1 -1
  21. package/dist/cjs/user/schemas/delete-user.schema.d.ts +1 -5
  22. package/dist/cjs/user/schemas/delete-user.schema.d.ts.map +1 -1
  23. package/dist/cjs/user/schemas/phone-login-verify.schema.d.ts +1 -9
  24. package/dist/cjs/user/schemas/phone-login-verify.schema.d.ts.map +1 -1
  25. package/dist/cjs/user/schemas/phone-login.schema.d.ts +1 -5
  26. package/dist/cjs/user/schemas/phone-login.schema.d.ts.map +1 -1
  27. package/dist/cjs/user/schemas/signup.schema.d.ts +1 -7
  28. package/dist/cjs/user/schemas/signup.schema.d.ts.map +1 -1
  29. package/dist/cjs/user/schemas/update-user.schema.d.ts +1 -13
  30. package/dist/cjs/user/schemas/update-user.schema.d.ts.map +1 -1
  31. package/dist/cjs/user/user.controller.d.ts.map +1 -1
  32. package/dist/cjs/user/user.controller.js.map +1 -1
  33. package/dist/cjs/user/user.util.d.ts.map +1 -1
  34. package/dist/cjs/utils/datetime.util.d.ts.map +1 -1
  35. package/dist/cjs/utils/error.util.d.ts.map +1 -1
  36. package/dist/cjs/utils/index.d.ts +1 -0
  37. package/dist/cjs/utils/index.d.ts.map +1 -1
  38. package/dist/cjs/utils/index.js +1 -0
  39. package/dist/cjs/utils/index.js.map +1 -1
  40. package/dist/cjs/utils/input.util.d.ts.map +1 -1
  41. package/dist/cjs/utils/string.util.d.ts +1 -0
  42. package/dist/cjs/utils/string.util.d.ts.map +1 -1
  43. package/dist/cjs/utils/string.util.js +5 -1
  44. package/dist/cjs/utils/string.util.js.map +1 -1
  45. package/dist/cjs/utils/version.util.d.ts +3 -0
  46. package/dist/cjs/utils/version.util.d.ts.map +1 -0
  47. package/dist/cjs/utils/version.util.js +19 -0
  48. package/dist/cjs/utils/version.util.js.map +1 -0
  49. package/dist/esm/cron/cron.util.d.ts.map +1 -1
  50. package/dist/esm/guard/auth.guard.d.ts.map +1 -1
  51. package/dist/esm/guard/auth.guard.js.map +1 -1
  52. package/dist/esm/health/dtos/health.response.dto.d.ts +1 -0
  53. package/dist/esm/health/dtos/health.response.dto.d.ts.map +1 -1
  54. package/dist/esm/health/dtos/health.response.dto.js +5 -0
  55. package/dist/esm/health/dtos/health.response.dto.js.map +1 -1
  56. package/dist/esm/health/health.service.d.ts +1 -1
  57. package/dist/esm/health/health.service.d.ts.map +1 -1
  58. package/dist/esm/health/health.service.js +4 -1
  59. package/dist/esm/health/health.service.js.map +1 -1
  60. package/dist/esm/middleware/logger.middleware.d.ts.map +1 -1
  61. package/dist/esm/middleware/logger.middleware.js.map +1 -1
  62. package/dist/esm/prisma/prisma.service.d.ts.map +1 -1
  63. package/dist/esm/prisma/prisma.service.js.map +1 -1
  64. package/dist/esm/search/search.service.d.ts +1 -1
  65. package/dist/esm/search/search.service.d.ts.map +1 -1
  66. package/dist/esm/search/search.service.js +23 -13
  67. package/dist/esm/search/search.service.js.map +1 -1
  68. package/dist/esm/services/instrument-sentry.d.ts.map +1 -1
  69. package/dist/esm/user/schemas/delete-user.schema.d.ts +1 -5
  70. package/dist/esm/user/schemas/delete-user.schema.d.ts.map +1 -1
  71. package/dist/esm/user/schemas/phone-login-verify.schema.d.ts +1 -9
  72. package/dist/esm/user/schemas/phone-login-verify.schema.d.ts.map +1 -1
  73. package/dist/esm/user/schemas/phone-login.schema.d.ts +1 -5
  74. package/dist/esm/user/schemas/phone-login.schema.d.ts.map +1 -1
  75. package/dist/esm/user/schemas/signup.schema.d.ts +1 -7
  76. package/dist/esm/user/schemas/signup.schema.d.ts.map +1 -1
  77. package/dist/esm/user/schemas/update-user.schema.d.ts +1 -13
  78. package/dist/esm/user/schemas/update-user.schema.d.ts.map +1 -1
  79. package/dist/esm/user/user.controller.d.ts.map +1 -1
  80. package/dist/esm/user/user.controller.js.map +1 -1
  81. package/dist/esm/user/user.util.d.ts.map +1 -1
  82. package/dist/esm/utils/datetime.util.d.ts.map +1 -1
  83. package/dist/esm/utils/error.util.d.ts.map +1 -1
  84. package/dist/esm/utils/index.d.ts +1 -0
  85. package/dist/esm/utils/index.d.ts.map +1 -1
  86. package/dist/esm/utils/index.js +1 -0
  87. package/dist/esm/utils/index.js.map +1 -1
  88. package/dist/esm/utils/input.util.d.ts.map +1 -1
  89. package/dist/esm/utils/string.util.d.ts +1 -0
  90. package/dist/esm/utils/string.util.d.ts.map +1 -1
  91. package/dist/esm/utils/string.util.js +3 -0
  92. package/dist/esm/utils/string.util.js.map +1 -1
  93. package/dist/esm/utils/version.util.d.ts +3 -0
  94. package/dist/esm/utils/version.util.d.ts.map +1 -0
  95. package/dist/esm/utils/version.util.js +13 -0
  96. package/dist/esm/utils/version.util.js.map +1 -0
  97. package/dist/tsconfig.tsbuildinfo +1 -1
  98. package/package.json +53 -53
  99. package/src/guard/auth.guard.ts +0 -3
  100. package/src/health/dtos/health.response.dto.ts +4 -0
  101. package/src/health/health.service.ts +4 -1
  102. package/src/middleware/logger.middleware.ts +0 -1
  103. package/src/prisma/prisma.service.ts +0 -2
  104. package/src/search/search.service.ts +27 -21
  105. package/src/user/user.controller.ts +1 -3
  106. package/src/utils/index.ts +1 -0
  107. package/src/utils/string.util.ts +4 -0
  108. package/src/utils/version.util.ts +16 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laboratory-one/api-components",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "API components for Laboratory One",
5
5
  "author": "Laboratory One",
6
6
  "private": false,
@@ -31,66 +31,66 @@
31
31
  "version:minor": "./scripts/version.sh minor"
32
32
  },
33
33
  "dependencies": {
34
- "@nestjs/axios": "3.0.2",
35
- "@nestjs/common": "10.3.9",
36
- "@nestjs/config": "3.2.2",
37
- "@nestjs/core": "10.3.9",
38
- "@nestjs/jwt": "10.2.0",
39
- "@nestjs/platform-express": "10.3.9",
40
- "@nestjs/schedule": "4.1.0",
41
- "@nestjs/swagger": "7.3.1",
42
- "@nestjs/terminus": "10.2.3",
43
- "@prisma/client": "5.15.1",
44
- "@sendgrid/mail": "8.1.3",
45
- "@sentry/cli": "2.32.1",
46
- "@sentry/nestjs": "8.26.0",
47
- "@sentry/node": "8.9.2",
48
- "@sentry/profiling-node": "8.9.2",
49
- "algoliasearch": "4.23.3",
50
- "axios": "1.7.2",
34
+ "@nestjs/axios": "4.0.1",
35
+ "@nestjs/common": "11.1.6",
36
+ "@nestjs/config": "4.0.2",
37
+ "@nestjs/core": "11.1.6",
38
+ "@nestjs/jwt": "11.0.0",
39
+ "@nestjs/platform-express": "11.1.6",
40
+ "@nestjs/schedule": "6.0.1",
41
+ "@nestjs/swagger": "11.2.0",
42
+ "@nestjs/terminus": "11.0.0",
43
+ "@prisma/client": "6.16.2",
44
+ "@sendgrid/mail": "8.1.6",
45
+ "@sentry/cli": "2.54.0",
46
+ "@sentry/nestjs": "10.12.0",
47
+ "@sentry/node": "10.12.0",
48
+ "@sentry/profiling-node": "10.12.0",
49
+ "algoliasearch": "5.37.0",
50
+ "axios": "1.12.2",
51
51
  "class-transformer": "0.5.1",
52
- "class-validator": "0.14.1",
53
- "compression": "1.7.4",
54
- "expo-server-sdk": "3.10.0",
55
- "globals": "15.6.0",
56
- "helmet": "7.1.0",
52
+ "class-validator": "0.14.2",
53
+ "compression": "1.8.1",
54
+ "expo-server-sdk": "4.0.0",
55
+ "globals": "16.4.0",
56
+ "helmet": "8.1.0",
57
57
  "moment": "2.30.1",
58
- "prisma": "5.15.1",
58
+ "prisma": "6.16.2",
59
59
  "reflect-metadata": "0.2.2",
60
- "rxjs": "7.8.1",
61
- "stytch": "10.18.0",
62
- "zod": "3.23.8"
60
+ "rxjs": "7.8.2",
61
+ "stytch": "12.35.0",
62
+ "zod": "4.1.11"
63
63
  },
64
64
  "devDependencies": {
65
- "@babel/core": "7.24.7",
66
- "@nestjs/cli": "10.3.2",
67
- "@nestjs/schematics": "10.1.1",
68
- "@nestjs/testing": "10.3.9",
69
- "@sentry/types": "8.26.0",
70
- "@tanstack/eslint-plugin-query": "5.43.1",
71
- "@types/compression": "1.7.5",
72
- "@types/express": "4.17.21",
73
- "@types/jest": "29.5.12",
74
- "@types/node": "20.14.5",
75
- "@types/supertest": "6.0.2",
76
- "@typescript-eslint/eslint-plugin": "7.13.1",
77
- "@typescript-eslint/parser": "7.13.1",
78
- "eslint": "8.57.0",
79
- "eslint-config-expo": "7.1.2",
80
- "eslint-config-prettier": "9.1.0",
81
- "eslint-import-resolver-typescript": "3.6.1",
82
- "eslint-plugin-import": "2.29.1",
83
- "eslint-plugin-prettier": "5.1.3",
84
- "jest": "29.7.0",
85
- "prettier": "3.3.2",
65
+ "@babel/core": "7.28.4",
66
+ "@nestjs/cli": "11.0.10",
67
+ "@nestjs/schematics": "11.0.7",
68
+ "@nestjs/testing": "11.1.6",
69
+ "@sentry/types": "10.12.0",
70
+ "@tanstack/eslint-plugin-query": "5.89.0",
71
+ "@types/compression": "1.8.1",
72
+ "@types/express": "5.0.3",
73
+ "@types/jest": "30.0.0",
74
+ "@types/node": "24.5.2",
75
+ "@types/supertest": "6.0.3",
76
+ "@typescript-eslint/eslint-plugin": "8.44.0",
77
+ "@typescript-eslint/parser": "8.44.0",
78
+ "eslint": "9.36.0",
79
+ "eslint-config-expo": "10.0.0",
80
+ "eslint-config-prettier": "10.1.8",
81
+ "eslint-import-resolver-typescript": "4.4.4",
82
+ "eslint-plugin-import": "2.32.0",
83
+ "eslint-plugin-prettier": "5.5.4",
84
+ "jest": "30.1.3",
85
+ "prettier": "3.6.2",
86
86
  "source-map-support": "0.5.21",
87
- "supertest": "7.0.0",
88
- "ts-jest": "29.1.5",
89
- "ts-loader": "9.5.1",
87
+ "supertest": "7.1.4",
88
+ "ts-jest": "29.4.4",
89
+ "ts-loader": "9.5.4",
90
90
  "ts-node": "10.9.2",
91
- "tsc-alias": "1.8.8",
91
+ "tsc-alias": "1.8.16",
92
92
  "tsconfig-paths": "4.2.0",
93
- "typescript": "5.4.5"
93
+ "typescript": "5.9.2"
94
94
  },
95
95
  "files": [
96
96
  "dist",
@@ -16,7 +16,6 @@ export class AuthGuard implements CanActivate {
16
16
  ) {}
17
17
 
18
18
  async canActivate(context: ExecutionContext): Promise<boolean> {
19
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
20
19
  const request = context.switchToHttp().getRequest();
21
20
  const token = this.extractTokenFromHeader(request);
22
21
 
@@ -25,12 +24,10 @@ export class AuthGuard implements CanActivate {
25
24
  }
26
25
 
27
26
  try {
28
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
29
27
  const payload = await this.jwtService.verifyAsync(token, {
30
28
  secret: this.configService.get<string>('JWT_SECRET'),
31
29
  });
32
30
 
33
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
34
31
  request['user'] = payload;
35
32
  } catch {
36
33
  throw new UnauthorizedException();
@@ -22,4 +22,8 @@ export class HealthResponseDto implements HealthCheckResult {
22
22
  @IsString()
23
23
  @ApiProperty()
24
24
  environment: string;
25
+
26
+ @IsString()
27
+ @ApiProperty()
28
+ version: string;
25
29
  }
@@ -6,7 +6,8 @@ import {
6
6
  } from '@nestjs/terminus';
7
7
  import { ConfigService } from '@nestjs/config';
8
8
 
9
- import { HealthResponseDto } from './dtos/health.response.dto';
9
+ import { HealthResponseDto } from './dtos';
10
+ import { getVersion } from '../utils';
10
11
 
11
12
  // this decorator indicates to nest that this class can be provided to a module
12
13
  // we want to handle logic in services to keep our resolvers and controllers clean
@@ -31,9 +32,11 @@ export class HealthService {
31
32
  ]);
32
33
 
33
34
  const environment: string = this.configService.get<string>('NODE_ENV');
35
+ const version: string = getVersion();
34
36
 
35
37
  return {
36
38
  environment,
39
+ version,
37
40
  ...statuses,
38
41
  };
39
42
  }
@@ -12,7 +12,6 @@ export class LoggerMiddleware implements NestMiddleware {
12
12
  req?.body?.operationName
13
13
  ) {
14
14
  this.logger.log(
15
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
16
15
  `${req.method} ${req.originalUrl} ${req.body.operationName}`,
17
16
  );
18
17
  } else {
@@ -26,9 +26,7 @@ export class PrismaService extends PrismaClient implements OnModuleInit {
26
26
  await this.$connect();
27
27
  }
28
28
 
29
- // eslint-disable-next-line @typescript-eslint/require-await
30
29
  async enableShutdownHooks(app: INestApplication) {
31
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
32
30
  this.$on('beforeExit' as never, async () => {
33
31
  await app.close();
34
32
  });
@@ -1,13 +1,13 @@
1
1
  import { Injectable, Logger } from '@nestjs/common';
2
- import algoliasearch from 'algoliasearch';
3
- import { SearchClient, SearchIndex } from 'algoliasearch/dist/algoliasearch';
2
+ import { algoliasearch } from 'algoliasearch';
3
+ import type { SearchClient } from 'algoliasearch';
4
4
  import { ConfigService } from '@nestjs/config';
5
5
 
6
6
  @Injectable()
7
7
  export class SearchService {
8
8
  private readonly logger: Logger = new Logger(SearchService.name);
9
9
  private readonly searchClient: SearchClient | undefined;
10
- private readonly searchIndex: SearchIndex | undefined;
10
+ private readonly indexName: string;
11
11
 
12
12
  constructor(private configService: ConfigService) {
13
13
  this.searchClient = algoliasearch(
@@ -19,41 +19,45 @@ export class SearchService {
19
19
  throw new Error('Search client is undefined');
20
20
  }
21
21
 
22
- this.searchIndex = this.searchClient.initIndex(
23
- this.configService.get('ALGOLIA_INDEX_NAME'),
24
- );
22
+ this.indexName = this.configService.get('ALGOLIA_INDEX_NAME');
25
23
  }
26
24
 
27
25
  async shouldIndex(): Promise<boolean> {
28
26
  this.logger.debug('shouldIndex');
29
27
 
30
- if (this.searchIndex === undefined) {
31
- throw new Error('Search index is undefined');
28
+ if (this.searchClient === undefined) {
29
+ throw new Error('Search client is undefined');
32
30
  }
33
31
 
34
- const { nbHits } = await this.searchIndex.search('', {
35
- hitsPerPage: 1,
32
+ const result = await this.searchClient.searchSingleIndex({
33
+ indexName: this.indexName,
34
+ searchParams: {
35
+ query: '',
36
+ hitsPerPage: 1,
37
+ },
36
38
  });
37
39
 
38
- return nbHits === 0;
40
+ return result.nbHits === 0;
39
41
  }
40
42
 
41
43
  async create(inventoryItem: any): Promise<undefined> {
42
44
  this.logger.debug('create');
43
45
 
44
- if (this.searchIndex === undefined) {
45
- throw new Error('Search index is undefined');
46
+ if (this.searchClient === undefined) {
47
+ throw new Error('Search client is undefined');
46
48
  }
47
49
 
48
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
49
50
  const mappedExercise = {
50
51
  ...inventoryItem,
51
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
52
+
52
53
  objectID: inventoryItem.id,
53
54
  quantity: 0,
54
55
  };
55
56
 
56
- await this.searchIndex.saveObject(mappedExercise).wait();
57
+ await this.searchClient.saveObject({
58
+ indexName: this.indexName,
59
+ body: mappedExercise,
60
+ });
57
61
 
58
62
  return;
59
63
  }
@@ -62,21 +66,23 @@ export class SearchService {
62
66
  try {
63
67
  this.logger.debug('createMany');
64
68
 
65
- if (this.searchIndex === undefined) {
66
- throw new Error('Search index is undefined');
69
+ if (this.searchClient === undefined) {
70
+ throw new Error('Search client is undefined');
67
71
  }
68
72
 
69
73
  const mappedExercises = inventoryItems.map((inventoryItem: any) => {
70
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
71
74
  return {
72
75
  ...inventoryItem,
73
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
76
+
74
77
  objectID: inventoryItem.id,
75
78
  quantity: 0,
76
79
  };
77
80
  });
78
81
 
79
- await this.searchIndex.saveObjects(mappedExercises).wait();
82
+ await this.searchClient.saveObjects({
83
+ indexName: this.indexName,
84
+ objects: mappedExercises,
85
+ });
80
86
 
81
87
  return;
82
88
  } catch (error) {
@@ -300,9 +300,7 @@ export class UserController {
300
300
  @Body() dto: DeleteUserRequestDto,
301
301
  ): Promise<void> {
302
302
  try {
303
- const parsedDto: DeleteUserRequestDto = (
304
- deleteUserSchema as ZodObject<any>
305
- ).parse(dto) as DeleteUserRequestDto;
303
+ const parsedDto = (deleteUserSchema as ZodObject<any>).parse(dto);
306
304
 
307
305
  const user: User = await this.userService.findOneByUserId(
308
306
  req.user.userId,
@@ -4,3 +4,4 @@ export * from './input.util';
4
4
  export * from './string.util';
5
5
  export * from './noop.util';
6
6
  export * from './schema.util';
7
+ export * from './version.util';
@@ -1,3 +1,7 @@
1
1
  export const getInitial = (name: string): string => {
2
2
  return name[0];
3
3
  };
4
+
5
+ export const getCapitalizedString = (str: string): string => {
6
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
7
+ };
@@ -0,0 +1,16 @@
1
+ import fs from 'fs';
2
+
3
+ export const getVersion = (): string => {
4
+ const currentDir = process.cwd();
5
+ const filePath = `${currentDir}/version.txt`;
6
+ return fs.readFileSync(filePath, 'utf8').toString();
7
+ };
8
+
9
+ export const createVersionFile = () => {
10
+ const packageJsonContent = fs.readFileSync('package.json', 'utf8');
11
+ const packageJson = JSON.parse(packageJsonContent);
12
+
13
+ const version = packageJson.version;
14
+
15
+ fs.writeFileSync('version.txt', version);
16
+ };