@mars-stack/core 8.0.0 → 8.0.2

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.
@@ -27,4 +27,4 @@ alwaysApply: false
27
27
 
28
28
  End-to-end specs live in **`e2e/`** (`yarn test:e2e`). When you add or materially change **user-facing** behaviour (pages, flows, CLI-generated features), extend **`e2e/*.spec.ts`** so at least one **stable happy path** is covered. Prefer role/label selectors; avoid sleep-only assertions.
29
29
 
30
- **Mars monorepo:** The template’s catalog and CLI-wide CI expectations are defined in **`docs/design-docs/scaffold-testing-strategy.md`** (Decision 7) and ticket **MARS-041**; update **`template/e2e/`** and its README when you change generators or template routes.
30
+ **Mars monorepo:** Catalog and CI expectations are in **`docs/design-docs/scaffold-testing-strategy.md`** (Decision 7). Update **`template/e2e/`** (baseline), **`template/e2e-kitchen-sink/`** (kitchen-sink catalog), and **`template/e2e/README.md`** when you change generators or template routes. See **MARS-041** (done).
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hashes a password using SHA-256 prehash followed by bcrypt (cost 12).
3
+ * Safe to import from Prisma seed scripts and other Node contexts outside Next.js.
4
+ */
5
+ export declare function hashPassword(password: string): Promise<string>;
6
+ /**
7
+ * Verifies a plaintext password against a stored bcrypt hash.
8
+ */
9
+ export declare function verifyPassword(plainPassword: string, hashedPassword: string): Promise<boolean>;
10
+ //# sourceMappingURL=password-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-hash.d.ts","sourceRoot":"","sources":["../../src/auth/password-hash.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAMlB"}
@@ -0,0 +1 @@
1
+ export { hashPassword, verifyPassword } from '../chunk-6WI62GWT.js';
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ /** Zod schema enforcing password strength rules: 8-100 chars, mixed case, digit, special char, no common patterns. */
3
+ export declare const passwordSchema: z.ZodString;
4
+ //# sourceMappingURL=password-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-schema.d.ts","sourceRoot":"","sources":["../../src/auth/password-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sHAAsH;AACtH,eAAO,MAAM,cAAc,aAYqE,CAAC"}
@@ -0,0 +1 @@
1
+ export { passwordSchema } from '../chunk-BJY4ZUID.js';
@@ -1,28 +1,4 @@
1
1
  import 'server-only';
2
- import { z } from 'zod';
3
- /** Zod schema enforcing password strength rules: 8-100 chars, mixed case, digit, special char, no common patterns. */
4
- export declare const passwordSchema: z.ZodString;
5
- /**
6
- * Hashes a password using SHA-256 prehash followed by bcrypt (cost 12).
7
- * The prehash step allows bcrypt to work with passwords of any length while
8
- * maintaining a domain separator to prevent cross-protocol collisions.
9
- *
10
- * @param password - The plaintext password to hash
11
- * @returns The bcrypt hash string
12
- * @example
13
- * const hash = await hashPassword('mySecureP@ss1');
14
- */
15
- export declare function hashPassword(password: string): Promise<string>;
16
- /**
17
- * Verifies a plaintext password against a stored bcrypt hash.
18
- * Attempts prehashed comparison first, then falls back to direct comparison
19
- * for backwards compatibility with legacy hashes.
20
- *
21
- * @param plainPassword - The plaintext password to verify
22
- * @param hashedPassword - The stored bcrypt hash
23
- * @returns True if the password matches
24
- * @example
25
- * const valid = await verifyPassword('mySecureP@ss1', storedHash);
26
- */
27
- export declare function verifyPassword(plainPassword: string, hashedPassword: string): Promise<boolean>;
2
+ export { passwordSchema } from './password-schema';
3
+ export { hashPassword, verifyPassword } from './password-hash';
28
4
  //# sourceMappingURL=password.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../src/auth/password.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,sHAAsH;AACtH,eAAO,MAAM,cAAc,aAYqE,CAAC;AAEjG;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAMlB"}
1
+ {"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../src/auth/password.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1 +1,3 @@
1
- export { hashPassword, passwordSchema, verifyPassword } from '../chunk-WO6FHJHG.js';
1
+ export { passwordSchema } from '../chunk-BJY4ZUID.js';
2
+ export { hashPassword, verifyPassword } from '../chunk-6WI62GWT.js';
3
+ import 'server-only';
@@ -1,4 +1,4 @@
1
- import { passwordSchema } from '../chunk-WO6FHJHG.js';
1
+ import { passwordSchema } from '../chunk-BJY4ZUID.js';
2
2
 
3
3
  // src/auth/validators.ts
4
4
  function validateEmail(value) {
@@ -1,7 +1,4 @@
1
- import 'server-only';
2
- import { z } from 'zod';
3
-
4
- // src/auth/password.ts
1
+ // src/auth/password-hash.ts
5
2
  var PASSWORD_PREHASH_DOMAIN = "mars-password-v1";
6
3
  async function sha256Prehash(password) {
7
4
  const payload = `${PASSWORD_PREHASH_DOMAIN}:${password}`;
@@ -9,10 +6,6 @@ async function sha256Prehash(password) {
9
6
  const digest = await crypto.subtle.digest("SHA-256", data);
10
7
  return Array.from(new Uint8Array(digest)).map((b) => b.toString(16).padStart(2, "0")).join("");
11
8
  }
12
- var passwordSchema = z.string().min(8, "Password must be at least 8 characters").max(100, "Password must be less than 100 characters").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number").regex(/[^A-Za-z0-9]/, "Password must contain at least one special character").refine(
13
- (password) => !password.toLowerCase().includes("password"),
14
- "Password cannot contain 'password'"
15
- ).refine((password) => !password.includes("123"), "Password cannot contain sequential numbers");
16
9
  async function hashPassword(password) {
17
10
  const { hash } = await import('bcryptjs');
18
11
  const prehashed = await sha256Prehash(password);
@@ -26,4 +19,4 @@ async function verifyPassword(plainPassword, hashedPassword) {
26
19
  return compare(plainPassword, hashedPassword);
27
20
  }
28
21
 
29
- export { hashPassword, passwordSchema, verifyPassword };
22
+ export { hashPassword, verifyPassword };
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/auth/password-schema.ts
4
+ var passwordSchema = z.string().min(8, "Password must be at least 8 characters").max(100, "Password must be less than 100 characters").regex(/[A-Z]/, "Password must contain at least one uppercase letter").regex(/[a-z]/, "Password must contain at least one lowercase letter").regex(/[0-9]/, "Password must contain at least one number").regex(/[^A-Za-z0-9]/, "Password must contain at least one special character").refine(
5
+ (password) => !password.toLowerCase().includes("password"),
6
+ "Password cannot contain 'password'"
7
+ ).refine((password) => !password.includes("123"), "Password cannot contain sequential numbers");
8
+
9
+ export { passwordSchema };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mars-stack/core",
3
- "version": "8.0.0",
3
+ "version": "8.0.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -32,6 +32,14 @@
32
32
  "types": "./dist/auth/password.d.ts",
33
33
  "import": "./dist/auth/password.js"
34
34
  },
35
+ "./auth/password-schema": {
36
+ "types": "./dist/auth/password-schema.d.ts",
37
+ "import": "./dist/auth/password-schema.js"
38
+ },
39
+ "./auth/password-hash": {
40
+ "types": "./dist/auth/password-hash.d.ts",
41
+ "import": "./dist/auth/password-hash.js"
42
+ },
35
43
  "./auth/verification": {
36
44
  "types": "./dist/auth/verification.d.ts",
37
45
  "import": "./dist/auth/verification.js"