@scryan7371/sdr-security 0.1.9 → 0.1.10

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.
@@ -11,12 +11,12 @@ class AddRefreshTokens1700000000001 {
11
11
  "token_hash" varchar NOT NULL,
12
12
  "expires_at" timestamptz NOT NULL,
13
13
  "revoked_at" timestamptz,
14
- "userId" uuid,
14
+ "user_id" uuid,
15
15
  "created_at" timestamptz NOT NULL DEFAULT (CURRENT_TIMESTAMP),
16
- CONSTRAINT "FK_refresh_token_user" FOREIGN KEY ("userId") REFERENCES ${userTableRef} ("id") ON DELETE CASCADE ON UPDATE NO ACTION
16
+ CONSTRAINT "FK_refresh_token_user" FOREIGN KEY ("user_id") REFERENCES ${userTableRef} ("id") ON DELETE CASCADE ON UPDATE NO ACTION
17
17
  )
18
18
  `);
19
- await queryRunner.query(`CREATE INDEX "IDX_refresh_token_user" ON "refresh_token" ("userId")`);
19
+ await queryRunner.query(`CREATE INDEX "IDX_refresh_token_user" ON "refresh_token" ("user_id")`);
20
20
  }
21
21
  async down(queryRunner) {
22
22
  await queryRunner.query(`DROP INDEX "IDX_refresh_token_user"`);
@@ -37,7 +37,7 @@ __decorate([
37
37
  __metadata("design:type", Object)
38
38
  ], RefreshTokenEntity.prototype, "revokedAt", void 0);
39
39
  __decorate([
40
- (0, typeorm_1.Column)({ type: "uuid", name: "userId", nullable: true }),
40
+ (0, typeorm_1.Column)({ type: "uuid", name: "user_id", nullable: true }),
41
41
  __metadata("design:type", Object)
42
42
  ], RefreshTokenEntity.prototype, "userId", void 0);
43
43
  __decorate([
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("@nestjs/common/constants");
4
+ const vitest_1 = require("vitest");
5
+ const security_auth_controller_1 = require("./security-auth.controller");
6
+ const routeMeta = (methodName) => {
7
+ const handler = security_auth_controller_1.SecurityAuthController.prototype[methodName];
8
+ return {
9
+ path: Reflect.getMetadata(constants_1.PATH_METADATA, handler),
10
+ method: Reflect.getMetadata(constants_1.METHOD_METADATA, handler),
11
+ };
12
+ };
13
+ (0, vitest_1.describe)("SecurityAuthController route metadata", () => {
14
+ (0, vitest_1.it)("defines the expected controller base path", () => {
15
+ (0, vitest_1.expect)(Reflect.getMetadata(constants_1.PATH_METADATA, security_auth_controller_1.SecurityAuthController)).toBe("security/auth");
16
+ });
17
+ (0, vitest_1.it)("defines the expected auth routes", () => {
18
+ (0, vitest_1.expect)(routeMeta("register").path).toBe("register");
19
+ (0, vitest_1.expect)(routeMeta("login").path).toBe("login");
20
+ (0, vitest_1.expect)(routeMeta("refresh").path).toBe("refresh");
21
+ (0, vitest_1.expect)(routeMeta("logout").path).toBe("logout");
22
+ (0, vitest_1.expect)(routeMeta("changePassword").path).toBe("change-password");
23
+ (0, vitest_1.expect)(routeMeta("forgotPassword").path).toBe("forgot-password");
24
+ (0, vitest_1.expect)(routeMeta("resetPassword").path).toBe("reset-password");
25
+ (0, vitest_1.expect)(routeMeta("verifyEmail").path).toBe("verify-email");
26
+ });
27
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("@nestjs/common/constants");
4
+ const vitest_1 = require("vitest");
5
+ const security_workflows_controller_1 = require("./security-workflows.controller");
6
+ const routePath = (methodName) => Reflect.getMetadata(constants_1.PATH_METADATA, security_workflows_controller_1.SecurityWorkflowsController.prototype[methodName]);
7
+ (0, vitest_1.describe)("SecurityWorkflowsController route metadata", () => {
8
+ (0, vitest_1.it)("defines the expected controller base path", () => {
9
+ (0, vitest_1.expect)(Reflect.getMetadata(constants_1.PATH_METADATA, security_workflows_controller_1.SecurityWorkflowsController)).toBe("security/workflows");
10
+ });
11
+ (0, vitest_1.it)("defines the expected workflow routes", () => {
12
+ (0, vitest_1.expect)(routePath("markEmailVerified")).toBe("users/:id/email-verified");
13
+ (0, vitest_1.expect)(routePath("setAdminApproval")).toBe("users/:id/admin-approval");
14
+ (0, vitest_1.expect)(routePath("setUserActive")).toBe("users/:id/active");
15
+ (0, vitest_1.expect)(routePath("listRoles")).toBe("roles");
16
+ (0, vitest_1.expect)(routePath("createRole")).toBe("roles");
17
+ (0, vitest_1.expect)(routePath("removeRole")).toBe("roles/:role");
18
+ (0, vitest_1.expect)(routePath("getUserRoles")).toBe("users/:userId/roles");
19
+ (0, vitest_1.expect)(routePath("setUserRoles")).toBe("users/:userId/roles");
20
+ (0, vitest_1.expect)(routePath("assignUserRole")).toBe("users/:userId/roles");
21
+ (0, vitest_1.expect)(routePath("removeUserRole")).toBe("users/:userId/roles/:role");
22
+ });
23
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scryan7371/sdr-security",
3
- "version": "0.1.9",
3
+ "version": "0.1.10",
4
4
  "description": "Reusable auth/security capability for API and app clients.",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -43,10 +43,10 @@
43
43
  "prepush": "npm run ci:prepush"
44
44
  },
45
45
  "dependencies": {
46
- "@babel/runtime": "7.28.6",
46
+ "@babel/runtime": "7.29.2",
47
47
  "bcryptjs": "3.0.3",
48
48
  "jsonwebtoken": "9.0.3",
49
- "uuid": "11.1.0"
49
+ "uuid": "13.0.0"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@nestjs/common": "^11.0.0",
@@ -69,20 +69,25 @@
69
69
  }
70
70
  },
71
71
  "devDependencies": {
72
- "@nestjs/common": "11.1.14",
72
+ "@nestjs/common": "11.1.17",
73
+ "@nestjs/core": "^11.1.17",
74
+ "@nestjs/platform-express": "^11.1.17",
73
75
  "@nestjs/swagger": "11.2.6",
76
+ "@nestjs/testing": "^11.1.17",
74
77
  "@nestjs/typeorm": "11.0.0",
75
78
  "@types/jsonwebtoken": "9.0.10",
76
- "@types/node": "^25.2.3",
77
- "@types/pg": "8.16.0",
78
- "@vitest/coverage-v8": "^4.0.18",
79
- "eslint": "9.18.0",
80
- "pg": "8.18.0",
79
+ "@types/node": "^25.5.0",
80
+ "@types/pg": "8.18.0",
81
+ "@types/supertest": "^7.2.0",
82
+ "@vitest/coverage-v8": "^4.1.0",
83
+ "eslint": "9.39.4",
84
+ "pg": "8.20.0",
81
85
  "prettier": "3.8.1",
86
+ "supertest": "^7.2.2",
82
87
  "typeorm": "0.3.28",
83
88
  "typescript": "5.9.3",
84
- "typescript-eslint": "8.56.0",
85
- "vitest": "4.0.18"
89
+ "typescript-eslint": "8.57.1",
90
+ "vitest": "4.1.0"
86
91
  },
87
92
  "typesVersions": {
88
93
  "*": {
@@ -12,13 +12,13 @@ export class AddRefreshTokens1700000000001 {
12
12
  "token_hash" varchar NOT NULL,
13
13
  "expires_at" timestamptz NOT NULL,
14
14
  "revoked_at" timestamptz,
15
- "userId" uuid,
15
+ "user_id" uuid,
16
16
  "created_at" timestamptz NOT NULL DEFAULT (CURRENT_TIMESTAMP),
17
- CONSTRAINT "FK_refresh_token_user" FOREIGN KEY ("userId") REFERENCES ${userTableRef} ("id") ON DELETE CASCADE ON UPDATE NO ACTION
17
+ CONSTRAINT "FK_refresh_token_user" FOREIGN KEY ("user_id") REFERENCES ${userTableRef} ("id") ON DELETE CASCADE ON UPDATE NO ACTION
18
18
  )
19
19
  `);
20
20
  await queryRunner.query(
21
- `CREATE INDEX "IDX_refresh_token_user" ON "refresh_token" ("userId")`,
21
+ `CREATE INDEX "IDX_refresh_token_user" ON "refresh_token" ("user_id")`,
22
22
  );
23
23
  }
24
24
 
@@ -14,7 +14,7 @@ export class RefreshTokenEntity {
14
14
  @Column({ type: "timestamptz", name: "revoked_at", nullable: true })
15
15
  revokedAt!: Date | null;
16
16
 
17
- @Column({ type: "uuid", name: "userId", nullable: true })
17
+ @Column({ type: "uuid", name: "user_id", nullable: true })
18
18
  userId!: string | null;
19
19
 
20
20
  @CreateDateColumn({ name: "created_at" })
@@ -0,0 +1,30 @@
1
+ import { METHOD_METADATA, PATH_METADATA } from "@nestjs/common/constants";
2
+ import { describe, expect, it } from "vitest";
3
+ import { SecurityAuthController } from "./security-auth.controller";
4
+
5
+ const routeMeta = (methodName: keyof SecurityAuthController) => {
6
+ const handler = SecurityAuthController.prototype[methodName] as object;
7
+ return {
8
+ path: Reflect.getMetadata(PATH_METADATA, handler),
9
+ method: Reflect.getMetadata(METHOD_METADATA, handler),
10
+ };
11
+ };
12
+
13
+ describe("SecurityAuthController route metadata", () => {
14
+ it("defines the expected controller base path", () => {
15
+ expect(Reflect.getMetadata(PATH_METADATA, SecurityAuthController)).toBe(
16
+ "security/auth",
17
+ );
18
+ });
19
+
20
+ it("defines the expected auth routes", () => {
21
+ expect(routeMeta("register").path).toBe("register");
22
+ expect(routeMeta("login").path).toBe("login");
23
+ expect(routeMeta("refresh").path).toBe("refresh");
24
+ expect(routeMeta("logout").path).toBe("logout");
25
+ expect(routeMeta("changePassword").path).toBe("change-password");
26
+ expect(routeMeta("forgotPassword").path).toBe("forgot-password");
27
+ expect(routeMeta("resetPassword").path).toBe("reset-password");
28
+ expect(routeMeta("verifyEmail").path).toBe("verify-email");
29
+ });
30
+ });
@@ -0,0 +1,30 @@
1
+ import { PATH_METADATA } from "@nestjs/common/constants";
2
+ import { describe, expect, it } from "vitest";
3
+ import { SecurityWorkflowsController } from "./security-workflows.controller";
4
+
5
+ const routePath = (methodName: keyof SecurityWorkflowsController) =>
6
+ Reflect.getMetadata(
7
+ PATH_METADATA,
8
+ SecurityWorkflowsController.prototype[methodName] as object,
9
+ );
10
+
11
+ describe("SecurityWorkflowsController route metadata", () => {
12
+ it("defines the expected controller base path", () => {
13
+ expect(
14
+ Reflect.getMetadata(PATH_METADATA, SecurityWorkflowsController),
15
+ ).toBe("security/workflows");
16
+ });
17
+
18
+ it("defines the expected workflow routes", () => {
19
+ expect(routePath("markEmailVerified")).toBe("users/:id/email-verified");
20
+ expect(routePath("setAdminApproval")).toBe("users/:id/admin-approval");
21
+ expect(routePath("setUserActive")).toBe("users/:id/active");
22
+ expect(routePath("listRoles")).toBe("roles");
23
+ expect(routePath("createRole")).toBe("roles");
24
+ expect(routePath("removeRole")).toBe("roles/:role");
25
+ expect(routePath("getUserRoles")).toBe("users/:userId/roles");
26
+ expect(routePath("setUserRoles")).toBe("users/:userId/roles");
27
+ expect(routePath("assignUserRole")).toBe("users/:userId/roles");
28
+ expect(routePath("removeUserRole")).toBe("users/:userId/roles/:role");
29
+ });
30
+ });