b4n1-web 0.7.0 → 0.9.3

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.
@@ -1,65 +1,65 @@
1
1
  /**
2
- * B4n1Web SecurityShield - URL Security Validation
2
+ * B4n1Web SecurityShield URL security validation with in-memory cache.
3
3
  *
4
- * Provides URL security validation with caching.
5
- * Fall-safe: returns safe=true if any error occurs.
6
- */
7
- import type { SecurityShieldOptions, SecurityCheckResult } from './types';
8
- /**
9
- * SecurityShield - Domain safety validation with caching
4
+ * SecurityShield provides URL safety checking for agentic browser navigation.
10
5
  *
11
- * @example
12
- * ```typescript
13
- * import { SecurityShield, navigate } from 'b4n1-web';
14
- *
15
- * // Simple usage
16
- * const result = await navigate('https://example.com');
17
- *
18
- * // With custom shield
19
- * const shield = new SecurityShield({ cacheDays: 30 });
20
- * const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
21
- * ```
6
+ * API:
7
+ * new SecurityShield({ dbPath?, cacheDays? })
8
+ * shield.isUrlSafe(url) → { isSafe: boolean, needsApiCheck: boolean }
9
+ * shield.markDomain(domain, isSafe)
10
+ * shield.clearCache()
22
11
  */
12
+ import type { SecurityShieldOptions, SecurityCheckResult } from './types';
23
13
  export declare class SecurityShield {
24
- private dbPath;
25
14
  private cacheDays;
26
15
  private cache;
27
- constructor(options?: SecurityShieldOptions);
28
16
  /**
29
- * Extract domain from URL
17
+ * Create a SecurityShield instance.
18
+ * @param opts - Optional configuration
19
+ * @param opts.cacheDays - TTL of a cached result in days (default 7)
30
20
  */
31
- private extractDomain;
21
+ constructor(opts?: SecurityShieldOptions);
32
22
  /**
33
- * Check if URL is safe to navigate
23
+ * Check whether a URL is safe to navigate.
24
+ *
25
+ * @param rawURL - The URL to check.
26
+ * @returns `{ isSafe, needsApiCheck }`
27
+ * isSafe — `true` if the domain is not blacklisted.
28
+ * needsApiCheck — `false` when the result was previously cached.
29
+ *
30
+ * @example
31
+ * const { isSafe, needsApiCheck } = shield.isUrlSafe('https://unknown.com');
32
+ * // → isSafe=true, needsApiCheck=true (unknown domain, needs screening)
33
+ *
34
+ * shield.markDomain('evil.com', false);
35
+ * shield.isUrlSafe('https://evil.com');
36
+ * // → isSafe=false, needsApiCheck=false (explicitly blacklisted)
34
37
  */
35
- isUrlSafe(url: string): SecurityCheckResult;
38
+ isUrlSafe(rawURL: string): SecurityCheckResult;
36
39
  /**
37
- * Mark a domain as safe or unsafe
40
+ * Explicitly mark a domain as safe (whitelist) or unsafe (blacklist).
41
+ * Overwrites any previous entry and resets the TTL timer.
42
+ *
43
+ * @param domain - The domain to mark, e.g. `"example.com"`
44
+ * @param isSafe - `true` to whitelist, `false` to blacklist
45
+ *
46
+ * @example
47
+ * shield.markDomain('trusted.com', true); // always allow
48
+ * shield.markDomain('malware.com', false); // always block
38
49
  */
39
50
  markDomain(domain: string, isSafe: boolean): void;
40
51
  /**
41
- * Clear all cached domains
52
+ * Remove all cached domain entries.
53
+ * After clearing, every next `isUrlSafe()` call for a previously-known domain
54
+ * will return `needsApiCheck=true` again.
42
55
  */
43
56
  clearCache(): void;
57
+ /**
58
+ * Extract the hostname from a URL string.
59
+ * Returns `''` for invalid / missing URLs.
60
+ * @internal — exposed for testing as `extractDomain`.
61
+ */
62
+ extractDomain(rawURL: string): string | null;
63
+ private _extractHost;
44
64
  }
45
- /**
46
- * Navigate to URL with optional security check
47
- *
48
- * @example
49
- * ```typescript
50
- * import { navigate } from 'b4n1-web';
51
- *
52
- * const result = await navigate('https://example.com');
53
- * if (result.success) {
54
- * console.log(result.markdown);
55
- * }
56
- * ```
57
- */
58
- export declare function navigate(url: string, ignoreSecurity?: boolean, securityShield?: SecurityShield): Promise<{
59
- url: string;
60
- success: boolean;
61
- markdown?: string;
62
- links?: string[];
63
- error?: string;
64
- }>;
65
65
  //# sourceMappingURL=security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAoD;gBAErD,OAAO,GAAE,qBAA0B;IAM/C;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;IAkB3C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAMjD;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,OAAe,EAC/B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAkCD"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAQ1E,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA0B;IAEvC;;;;OAIG;gBACS,IAAI,GAAE,qBAA0B;IAK5C;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAsB9C;;;;;;;;;;OAUG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAMjD;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAMlB;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsD5C,OAAO,CAAC,YAAY;CAIrB"}
package/dist/security.js CHANGED
@@ -1,126 +1,160 @@
1
1
  "use strict";
2
2
  /**
3
- * B4n1Web SecurityShield - URL Security Validation
3
+ * B4n1Web SecurityShield URL security validation with in-memory cache.
4
4
  *
5
- * Provides URL security validation with caching.
6
- * Fall-safe: returns safe=true if any error occurs.
5
+ * SecurityShield provides URL safety checking for agentic browser navigation.
6
+ *
7
+ * API:
8
+ * new SecurityShield({ dbPath?, cacheDays? })
9
+ * shield.isUrlSafe(url) → { isSafe: boolean, needsApiCheck: boolean }
10
+ * shield.markDomain(domain, isSafe)
11
+ * shield.clearCache()
7
12
  */
8
13
  Object.defineProperty(exports, "__esModule", { value: true });
9
14
  exports.SecurityShield = void 0;
10
- exports.navigate = navigate;
11
- const browser_1 = require("./browser");
12
- const types_1 = require("./types");
13
- /**
14
- * SecurityShield - Domain safety validation with caching
15
- *
16
- * @example
17
- * ```typescript
18
- * import { SecurityShield, navigate } from 'b4n1-web';
19
- *
20
- * // Simple usage
21
- * const result = await navigate('https://example.com');
22
- *
23
- * // With custom shield
24
- * const shield = new SecurityShield({ cacheDays: 30 });
25
- * const { isSafe, needsApiCheck } = shield.isUrlSafe('https://example.com');
26
- * ```
27
- */
15
+ /** Default cache TTL in days */
16
+ const DEFAULT_CACHE_DAYS = 7;
28
17
  class SecurityShield {
29
- constructor(options = {}) {
30
- this.dbPath = options.dbPath ?? `${process.env.HOME}/.b4n1web/security.db`;
31
- this.cacheDays = options.cacheDays ?? 7;
32
- this.cache = new Map();
33
- }
18
+ cacheDays;
19
+ cache;
34
20
  /**
35
- * Extract domain from URL
21
+ * Create a SecurityShield instance.
22
+ * @param opts - Optional configuration
23
+ * @param opts.cacheDays - TTL of a cached result in days (default 7)
36
24
  */
37
- extractDomain(url) {
38
- try {
39
- const parsed = new URL(url);
40
- return parsed.hostname.toLowerCase();
41
- }
42
- catch {
43
- return null;
44
- }
25
+ constructor(opts = {}) {
26
+ this.cacheDays = opts.cacheDays ?? DEFAULT_CACHE_DAYS;
27
+ this.cache = new Map();
45
28
  }
46
29
  /**
47
- * Check if URL is safe to navigate
30
+ * Check whether a URL is safe to navigate.
31
+ *
32
+ * @param rawURL - The URL to check.
33
+ * @returns `{ isSafe, needsApiCheck }`
34
+ * isSafe — `true` if the domain is not blacklisted.
35
+ * needsApiCheck — `false` when the result was previously cached.
36
+ *
37
+ * @example
38
+ * const { isSafe, needsApiCheck } = shield.isUrlSafe('https://unknown.com');
39
+ * // → isSafe=true, needsApiCheck=true (unknown domain, needs screening)
40
+ *
41
+ * shield.markDomain('evil.com', false);
42
+ * shield.isUrlSafe('https://evil.com');
43
+ * // → isSafe=false, needsApiCheck=false (explicitly blacklisted)
48
44
  */
49
- isUrlSafe(url) {
50
- const domain = this.extractDomain(url);
51
- if (!domain) {
45
+ isUrlSafe(rawURL) {
46
+ const host = this._extractHost(rawURL);
47
+ if (!host) {
48
+ // Invalid URL — safe default, no API check needed
52
49
  return { isSafe: true, needsApiCheck: false };
53
50
  }
54
- const cached = this.cache.get(domain);
55
- if (cached) {
56
- if (Date.now() > cached.expires) {
57
- this.cache.delete(domain);
58
- return { isSafe: true, needsApiCheck: true };
51
+ const now = Date.now();
52
+ const entry = this.cache.get(host);
53
+ if (entry) {
54
+ if (now < entry.expires) {
55
+ // Cached and fresh does not need an external API call
56
+ return { isSafe: entry.isSafe, needsApiCheck: false };
59
57
  }
60
- return { isSafe: cached.isSafe, needsApiCheck: false };
58
+ // Expired re-check
59
+ this.cache.delete(host);
61
60
  }
61
+ // New domain — safe but needs external API verification
62
62
  return { isSafe: true, needsApiCheck: true };
63
63
  }
64
64
  /**
65
- * Mark a domain as safe or unsafe
65
+ * Explicitly mark a domain as safe (whitelist) or unsafe (blacklist).
66
+ * Overwrites any previous entry and resets the TTL timer.
67
+ *
68
+ * @param domain - The domain to mark, e.g. `"example.com"`
69
+ * @param isSafe - `true` to whitelist, `false` to blacklist
70
+ *
71
+ * @example
72
+ * shield.markDomain('trusted.com', true); // always allow
73
+ * shield.markDomain('malware.com', false); // always block
66
74
  */
67
75
  markDomain(domain, isSafe) {
68
- const normalizedDomain = domain.toLowerCase();
69
- const expires = Date.now() + this.cacheDays * 24 * 60 * 60 * 1000;
70
- this.cache.set(normalizedDomain, { isSafe, expires });
76
+ const normalized = domain.toLowerCase().trim();
77
+ const expires = Date.now() + this.cacheDays * 86400_000; // days ms
78
+ this.cache.set(normalized, { isSafe, expires });
71
79
  }
72
80
  /**
73
- * Clear all cached domains
81
+ * Remove all cached domain entries.
82
+ * After clearing, every next `isUrlSafe()` call for a previously-known domain
83
+ * will return `needsApiCheck=true` again.
74
84
  */
75
85
  clearCache() {
76
86
  this.cache.clear();
77
87
  }
78
- }
79
- exports.SecurityShield = SecurityShield;
80
- /**
81
- * Navigate to URL with optional security check
82
- *
83
- * @example
84
- * ```typescript
85
- * import { navigate } from 'b4n1-web';
86
- *
87
- * const result = await navigate('https://example.com');
88
- * if (result.success) {
89
- * console.log(result.markdown);
90
- * }
91
- * ```
92
- */
93
- async function navigate(url, ignoreSecurity = false, securityShield) {
94
- if (!securityShield) {
95
- securityShield = new SecurityShield();
96
- }
97
- if (!ignoreSecurity) {
98
- const { isSafe } = securityShield.isUrlSafe(url);
99
- if (!isSafe) {
100
- return {
101
- url,
102
- success: false,
103
- error: 'URL flagged as unsafe by security check',
104
- };
88
+ // ── helpers ────────────────────────────────────────────────
89
+ /**
90
+ * Extract the hostname from a URL string.
91
+ * Returns `''` for invalid / missing URLs.
92
+ * @internal — exposed for testing as `extractDomain`.
93
+ */
94
+ extractDomain(rawURL) {
95
+ try {
96
+ const url = rawURL?.trim();
97
+ if (!url)
98
+ return null;
99
+ let rest;
100
+ // Check for scheme (handles both :// and : schemes like data:, javascript:)
101
+ const schemeIndex = url.indexOf(':');
102
+ if (schemeIndex === -1) {
103
+ // no scheme
104
+ return null;
105
+ }
106
+ const scheme = url.slice(0, schemeIndex);
107
+ rest = url.slice(schemeIndex + 1);
108
+ // Handle special cases for schemes
109
+ if (scheme === 'data' || scheme === 'javascript') {
110
+ return '';
111
+ }
112
+ // Handle // authority format (like //example.com/path)
113
+ if (rest.startsWith('//')) {
114
+ rest = rest.slice(2);
115
+ }
116
+ // For other schemes like http:, https:, ftp:, etc., we already removed the scheme above
117
+ // Strip userinfo "user:pass@"
118
+ const atIdx = rest.lastIndexOf('@');
119
+ const afterAuth = atIdx >= 0 ? rest.slice(atIdx + 1) : rest;
120
+ // Strip path/query/fragment
121
+ const [rawHost, ..._] = afterAuth.split(/[\/?#]/, 1);
122
+ if (!rawHost)
123
+ return null;
124
+ let host = rawHost.trim();
125
+ if (!host)
126
+ return null;
127
+ // IPv6 in brackets: [::1]:8080 → ::
128
+ if (host.startsWith('[')) {
129
+ const bracketEnd = host.indexOf(']');
130
+ if (bracketEnd === -1)
131
+ return null;
132
+ host = host.slice(1, bracketEnd); // Extract content between brackets
133
+ return host.toLowerCase(); // ::1 is final, no port to strip
134
+ }
135
+ // Strip port after last ':' — works for 'example.com:8080'
136
+ const colonIdx = host.lastIndexOf(':');
137
+ if (colonIdx > 0) {
138
+ host = host.slice(0, colonIdx);
139
+ }
140
+ // Accept localhost / single-label hosts too
141
+ return host.toLowerCase() || null;
142
+ }
143
+ catch {
144
+ return null;
105
145
  }
106
146
  }
107
- try {
108
- const browser = new browser_1.AgentBrowser({ mode: types_1.BrowserMode.LIGHT });
109
- const page = await browser.goto(url);
110
- browser.close();
111
- return {
112
- url: page.url,
113
- success: true,
114
- markdown: page.markdown,
115
- links: page.links,
116
- };
117
- }
118
- catch (error) {
119
- return {
120
- url,
121
- success: false,
122
- error: error.message,
123
- };
147
+ _extractHost(rawURL) {
148
+ const r = this.extractDomain(rawURL);
149
+ return r ?? '';
124
150
  }
125
151
  }
152
+ exports.SecurityShield = SecurityShield;
153
+ function _stripPort(host) {
154
+ const at = host.indexOf('@');
155
+ const colon = host.indexOf(':', at >= 0 ? at + 1 : 0);
156
+ if (colon >= 0)
157
+ return host.slice(0, colon);
158
+ return host;
159
+ }
126
160
  //# sourceMappingURL=security.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -30,6 +30,11 @@ export interface SecurityCheckResult {
30
30
  isSafe: boolean;
31
31
  needsApiCheck: boolean;
32
32
  }
33
+ export interface IframeInfo {
34
+ index: number;
35
+ src?: string;
36
+ title?: string;
37
+ }
33
38
  export declare class BinaryNotFoundError extends Error {
34
39
  constructor(message?: string);
35
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,EAAE,OAAO;IACT,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAI3H"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,KAAK,UAAU;IACf,EAAE,OAAO;IACT,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,SAAuG;CAI3H"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,wBAAS,CAAA;IACT,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAkCD,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,oGAAoG;QACxH,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,8BAAe,CAAA;IACf,wBAAS,CAAA;IACT,gCAAiB,CAAA;AACnB,CAAC,EAJW,WAAW,2BAAX,WAAW,QAItB;AAwCD,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,GAAG,oGAAoG;QACxH,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "b4n1-web",
3
- "version": "0.7.0",
3
+ "version": "0.9.3",
4
4
  "description": "B4n1Web SDK for JavaScript/TypeScript - Agentic Browser Engine with bundled binary",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  ],
29
29
  "author": "Bani Montoya <banimontoya@gmail.com>",
30
30
  "license": "MIT",
31
- "homepage": "https://github.com/B4N1-com/b4n1-web",
31
+ "homepage": "https://web.b4n1.com",
32
32
  "repository": {
33
33
  "type": "git",
34
34
  "url": "https://github.com/B4N1-com/b4n1-web.git"
@@ -38,7 +38,8 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^20.0.0",
41
- "typescript": "^5.0.0"
41
+ "typescript": "^5.0.0",
42
+ "vitest": "^4.1.6"
42
43
  },
43
44
  "engines": {
44
45
  "node": ">=18.0.0"