hazo_auth 5.1.38 → 5.1.40
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.
package/README.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
A reusable authentication UI component package powered by Next.js, TailwindCSS, and shadcn. It integrates `hazo_config` for configuration management and `hazo_connect` for data access, enabling future components to stay aligned with platform conventions.
|
|
4
4
|
|
|
5
|
+
### What's New in v5.1.39 🔧
|
|
6
|
+
|
|
7
|
+
**Postgres-Compatibility Schema Alignment** — fixes two long-standing drifts between the canonical SQLite schema and what the runtime actually writes. SQLite consumers see no behaviour change; Postgres + PostgREST consumers can now sign-up users without bespoke schema patches.
|
|
8
|
+
|
|
9
|
+
- **`hazo_refresh_tokens.token_hash`** — `token_service.ts` writes the argon2-hashed token, but the canonical schema only declared `token`. Added `token_hash TEXT` column and an index on it; relaxed the legacy plaintext `token` column to nullable. Runtime no longer writes plaintext, so this is purely additive for new installs.
|
|
10
|
+
- **Boolean-typed columns** — `hazo_users.email_verified` and the four flags on `hazo_user_relationships` (`can_view_progress`, `can_edit_profile`, `can_delete`, `is_self`) are now declared `BOOLEAN` instead of `INTEGER`. SQLite tolerates `BOOLEAN` as a NUMERIC affinity (existing 0/1 data evaluates correctly). PostgreSQL via PostgREST was previously rejecting the runtime's `email_verified: false` payload with `400 — invalid input syntax for type integer: "false"`; now it accepts the boolean cleanly.
|
|
11
|
+
- **Migration `014_align_schema_with_runtime.sql`** — applies the two changes above to existing deployments. SQLite version is active (additive `ADD COLUMN`); PostgreSQL ALTERs are commented blocks for consumers to opt in (with `NOTIFY pgrst, 'reload schema';` reminders).
|
|
12
|
+
|
|
13
|
+
Reported by Kinstripe (Postgres + PostgREST consumer) during sign-up smoke tests on 2026-04-28.
|
|
14
|
+
|
|
5
15
|
### What's New in v5.1.28
|
|
6
16
|
|
|
7
17
|
**Schema Validation, Permission Constants & DX Improvements**
|
|
@@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS hazo_users (
|
|
|
12
12
|
email_address TEXT NOT NULL UNIQUE,
|
|
13
13
|
password_hash TEXT,
|
|
14
14
|
name TEXT,
|
|
15
|
-
email_verified
|
|
15
|
+
email_verified BOOLEAN DEFAULT false,
|
|
16
16
|
login_attempts INTEGER DEFAULT 0,
|
|
17
17
|
last_logon TEXT,
|
|
18
18
|
profile_picture_url TEXT,
|
|
@@ -35,10 +35,15 @@ CREATE INDEX IF NOT EXISTS idx_hazo_users_google_id ON hazo_users(google_id);
|
|
|
35
35
|
CREATE INDEX IF NOT EXISTS idx_hazo_users_status ON hazo_users(status);
|
|
36
36
|
|
|
37
37
|
-- Refresh tokens table
|
|
38
|
+
-- Note: runtime (token_service.ts) writes token_hash (argon2-hashed value) on
|
|
39
|
+
-- insert and verifies via argon2.verify(token_hash, plaintext_token) on read.
|
|
40
|
+
-- The plaintext "token" column is retained nullable for legacy compatibility
|
|
41
|
+
-- but new writes only set token_hash.
|
|
38
42
|
CREATE TABLE IF NOT EXISTS hazo_refresh_tokens (
|
|
39
43
|
id TEXT PRIMARY KEY,
|
|
40
44
|
user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
41
|
-
token TEXT
|
|
45
|
+
token TEXT UNIQUE,
|
|
46
|
+
token_hash TEXT,
|
|
42
47
|
token_type TEXT DEFAULT 'refresh',
|
|
43
48
|
expires_at TEXT NOT NULL,
|
|
44
49
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
@@ -46,6 +51,7 @@ CREATE TABLE IF NOT EXISTS hazo_refresh_tokens (
|
|
|
46
51
|
|
|
47
52
|
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_user ON hazo_refresh_tokens(user_id);
|
|
48
53
|
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token ON hazo_refresh_tokens(token);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token_hash ON hazo_refresh_tokens(token_hash);
|
|
49
55
|
|
|
50
56
|
-- Roles table
|
|
51
57
|
CREATE TABLE IF NOT EXISTS hazo_roles (
|
|
@@ -145,10 +151,10 @@ CREATE TABLE IF NOT EXISTS hazo_user_relationships (
|
|
|
145
151
|
parent_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
146
152
|
child_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
147
153
|
relationship_type TEXT NOT NULL DEFAULT 'parent',
|
|
148
|
-
can_view_progress
|
|
149
|
-
can_edit_profile
|
|
150
|
-
can_delete
|
|
151
|
-
is_self
|
|
154
|
+
can_view_progress BOOLEAN DEFAULT true,
|
|
155
|
+
can_edit_profile BOOLEAN DEFAULT true,
|
|
156
|
+
can_delete BOOLEAN DEFAULT false,
|
|
157
|
+
is_self BOOLEAN DEFAULT false,
|
|
152
158
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
153
159
|
UNIQUE(parent_user_id, child_user_id)
|
|
154
160
|
);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SQLITE_SCHEMA = "\n-- hazo_auth canonical SQLite schema\n-- This schema creates all tables required by hazo_auth\n\n-- Users table (from migration 011)\nCREATE TABLE IF NOT EXISTS hazo_users (\n id TEXT PRIMARY KEY,\n email_address TEXT NOT NULL UNIQUE,\n password_hash TEXT,\n name TEXT,\n email_verified
|
|
1
|
+
export declare const SQLITE_SCHEMA = "\n-- hazo_auth canonical SQLite schema\n-- This schema creates all tables required by hazo_auth\n\n-- Users table (from migration 011)\nCREATE TABLE IF NOT EXISTS hazo_users (\n id TEXT PRIMARY KEY,\n email_address TEXT NOT NULL UNIQUE,\n password_hash TEXT,\n name TEXT,\n email_verified BOOLEAN DEFAULT false,\n login_attempts INTEGER DEFAULT 0,\n last_logon TEXT,\n profile_picture_url TEXT,\n profile_source TEXT CHECK(profile_source IN ('gravatar', 'custom', 'predefined')),\n mfa_secret TEXT,\n url_on_logon TEXT,\n google_id TEXT UNIQUE,\n auth_providers TEXT DEFAULT 'email',\n user_type TEXT,\n app_user_data TEXT,\n status TEXT DEFAULT 'ACTIVE' CHECK(status IN ('PENDING', 'ACTIVE', 'BLOCKED')),\n managed_by_user_id TEXT REFERENCES hazo_users(id) ON DELETE SET NULL,\n pin_hash TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_users_email ON hazo_users(email_address);\nCREATE INDEX IF NOT EXISTS idx_hazo_users_google_id ON hazo_users(google_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_users_status ON hazo_users(status);\n\n-- Refresh tokens table\n-- Note: runtime (token_service.ts) writes token_hash (argon2-hashed value) on\n-- insert and verifies via argon2.verify(token_hash, plaintext_token) on read.\n-- The plaintext \"token\" column is retained nullable for legacy compatibility\n-- but new writes only set token_hash.\nCREATE TABLE IF NOT EXISTS hazo_refresh_tokens (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,\n token TEXT UNIQUE,\n token_hash TEXT,\n token_type TEXT DEFAULT 'refresh',\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_user ON hazo_refresh_tokens(user_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token ON hazo_refresh_tokens(token);\nCREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token_hash ON hazo_refresh_tokens(token_hash);\n\n-- Roles table\nCREATE TABLE IF NOT EXISTS hazo_roles (\n id TEXT PRIMARY KEY,\n role_name TEXT NOT NULL UNIQUE,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Permissions table\nCREATE TABLE IF NOT EXISTS hazo_permissions (\n id TEXT PRIMARY KEY,\n permission_name TEXT NOT NULL UNIQUE,\n description TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Role-permission assignments (composite PK, no id column)\nCREATE TABLE IF NOT EXISTS hazo_role_permissions (\n role_id TEXT NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,\n permission_id TEXT NOT NULL REFERENCES hazo_permissions(id) ON DELETE CASCADE,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (role_id, permission_id)\n);\n\n-- Unified scopes table (hierarchical multi-tenancy)\nCREATE TABLE IF NOT EXISTS hazo_scopes (\n id TEXT PRIMARY KEY,\n parent_id TEXT REFERENCES hazo_scopes(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n level TEXT NOT NULL,\n logo_url TEXT,\n primary_color TEXT,\n secondary_color TEXT,\n tagline TEXT,\n slug TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_scopes_parent ON hazo_scopes(parent_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_scopes_level ON hazo_scopes(level);\nCREATE INDEX IF NOT EXISTS idx_hazo_scopes_slug ON hazo_scopes(slug);\n\n-- Super admin scope\nINSERT OR IGNORE INTO hazo_scopes (id, parent_id, name, level, created_at, changed_at)\nVALUES ('00000000-0000-0000-0000-000000000000', NULL, 'Super Admin', 'system', datetime('now'), datetime('now'));\n\n-- Default system scope (for non-multi-tenancy mode)\nINSERT OR IGNORE INTO hazo_scopes (id, parent_id, name, level, created_at, changed_at)\nVALUES ('00000000-0000-0000-0000-000000000001', NULL, 'System', 'default', datetime('now'), datetime('now'));\n\n-- User-scope assignments (membership model with scope-specific roles)\nCREATE TABLE IF NOT EXISTS hazo_user_scopes (\n user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,\n scope_id TEXT NOT NULL REFERENCES hazo_scopes(id) ON DELETE CASCADE,\n root_scope_id TEXT NOT NULL REFERENCES hazo_scopes(id) ON DELETE CASCADE,\n role_id TEXT NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,\n status TEXT DEFAULT 'ACTIVE' CHECK (status IN ('INVITED', 'ACTIVE', 'SUSPENDED', 'DEPARTED')),\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (user_id, scope_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_user_scopes_scope ON hazo_user_scopes(scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_user_scopes_root ON hazo_user_scopes(root_scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_user_scopes_role ON hazo_user_scopes(role_id);\n\n-- Invitations table\nCREATE TABLE IF NOT EXISTS hazo_invitations (\n id TEXT PRIMARY KEY,\n email_address TEXT NOT NULL,\n token TEXT NOT NULL UNIQUE,\n scope_id TEXT NOT NULL REFERENCES hazo_scopes(id) ON DELETE CASCADE,\n root_scope_id TEXT NOT NULL REFERENCES hazo_scopes(id) ON DELETE CASCADE,\n role_id TEXT NOT NULL REFERENCES hazo_roles(id) ON DELETE CASCADE,\n invited_by TEXT REFERENCES hazo_users(id) ON DELETE SET NULL,\n status TEXT NOT NULL DEFAULT 'PENDING' CHECK(status IN ('PENDING', 'ACCEPTED', 'EXPIRED', 'REVOKED')),\n expires_at TEXT NOT NULL,\n accepted_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n changed_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_invitations_email ON hazo_invitations(email_address);\nCREATE INDEX IF NOT EXISTS idx_hazo_invitations_token ON hazo_invitations(token);\nCREATE INDEX IF NOT EXISTS idx_hazo_invitations_scope ON hazo_invitations(scope_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_invitations_status ON hazo_invitations(status);\nCREATE INDEX IF NOT EXISTS idx_hazo_invitations_expires ON hazo_invitations(expires_at);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_users_managed_by ON hazo_users(managed_by_user_id);\n\n-- Relationships table\nCREATE TABLE IF NOT EXISTS hazo_user_relationships (\n id TEXT PRIMARY KEY,\n parent_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,\n child_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,\n relationship_type TEXT NOT NULL DEFAULT 'parent',\n can_view_progress BOOLEAN DEFAULT true,\n can_edit_profile BOOLEAN DEFAULT true,\n can_delete BOOLEAN DEFAULT false,\n is_self BOOLEAN DEFAULT false,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(parent_user_id, child_user_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_hazo_user_relationships_parent ON hazo_user_relationships(parent_user_id);\nCREATE INDEX IF NOT EXISTS idx_hazo_user_relationships_child ON hazo_user_relationships(child_user_id);\n\n-- Firm admin role (for firm creators)\nINSERT OR IGNORE INTO hazo_roles (id, role_name, created_at, changed_at)\nVALUES (lower(hex(randomblob(4)) || '-' || hex(randomblob(2)) || '-4' || substr(hex(randomblob(2)),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(hex(randomblob(2)),2) || '-' || hex(randomblob(6))), 'firm_admin', datetime('now'), datetime('now'));\n";
|
|
2
2
|
//# sourceMappingURL=sqlite_schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite_schema.d.ts","sourceRoot":"","sources":["../../../src/lib/schema/sqlite_schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"sqlite_schema.d.ts","sourceRoot":"","sources":["../../../src/lib/schema/sqlite_schema.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,uuOAmKzB,CAAC"}
|
|
@@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS hazo_users (
|
|
|
11
11
|
email_address TEXT NOT NULL UNIQUE,
|
|
12
12
|
password_hash TEXT,
|
|
13
13
|
name TEXT,
|
|
14
|
-
email_verified
|
|
14
|
+
email_verified BOOLEAN DEFAULT false,
|
|
15
15
|
login_attempts INTEGER DEFAULT 0,
|
|
16
16
|
last_logon TEXT,
|
|
17
17
|
profile_picture_url TEXT,
|
|
@@ -34,10 +34,15 @@ CREATE INDEX IF NOT EXISTS idx_hazo_users_google_id ON hazo_users(google_id);
|
|
|
34
34
|
CREATE INDEX IF NOT EXISTS idx_hazo_users_status ON hazo_users(status);
|
|
35
35
|
|
|
36
36
|
-- Refresh tokens table
|
|
37
|
+
-- Note: runtime (token_service.ts) writes token_hash (argon2-hashed value) on
|
|
38
|
+
-- insert and verifies via argon2.verify(token_hash, plaintext_token) on read.
|
|
39
|
+
-- The plaintext "token" column is retained nullable for legacy compatibility
|
|
40
|
+
-- but new writes only set token_hash.
|
|
37
41
|
CREATE TABLE IF NOT EXISTS hazo_refresh_tokens (
|
|
38
42
|
id TEXT PRIMARY KEY,
|
|
39
43
|
user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
40
|
-
token TEXT
|
|
44
|
+
token TEXT UNIQUE,
|
|
45
|
+
token_hash TEXT,
|
|
41
46
|
token_type TEXT DEFAULT 'refresh',
|
|
42
47
|
expires_at TEXT NOT NULL,
|
|
43
48
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
@@ -45,6 +50,7 @@ CREATE TABLE IF NOT EXISTS hazo_refresh_tokens (
|
|
|
45
50
|
|
|
46
51
|
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_user ON hazo_refresh_tokens(user_id);
|
|
47
52
|
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token ON hazo_refresh_tokens(token);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_hazo_refresh_tokens_token_hash ON hazo_refresh_tokens(token_hash);
|
|
48
54
|
|
|
49
55
|
-- Roles table
|
|
50
56
|
CREATE TABLE IF NOT EXISTS hazo_roles (
|
|
@@ -144,10 +150,10 @@ CREATE TABLE IF NOT EXISTS hazo_user_relationships (
|
|
|
144
150
|
parent_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
145
151
|
child_user_id TEXT NOT NULL REFERENCES hazo_users(id) ON DELETE CASCADE,
|
|
146
152
|
relationship_type TEXT NOT NULL DEFAULT 'parent',
|
|
147
|
-
can_view_progress
|
|
148
|
-
can_edit_profile
|
|
149
|
-
can_delete
|
|
150
|
-
is_self
|
|
153
|
+
can_view_progress BOOLEAN DEFAULT true,
|
|
154
|
+
can_edit_profile BOOLEAN DEFAULT true,
|
|
155
|
+
can_delete BOOLEAN DEFAULT false,
|
|
156
|
+
is_self BOOLEAN DEFAULT false,
|
|
151
157
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
152
158
|
UNIQUE(parent_user_id, child_user_id)
|
|
153
159
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hazo_auth",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.40",
|
|
4
4
|
"description": "Zero-config authentication UI components for Next.js with RBAC, OAuth, scope-based multi-tenancy, and invitations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"authentication",
|
|
@@ -230,17 +230,6 @@
|
|
|
230
230
|
"multer": "^2.0.2"
|
|
231
231
|
},
|
|
232
232
|
"peerDependencies": {
|
|
233
|
-
"hazo_config": "^1.4.0 || ^2.0.0",
|
|
234
|
-
"hazo_connect": "^2.4.0",
|
|
235
|
-
"hazo_logs": "^1.0.10",
|
|
236
|
-
"hazo_notify": "^1.0.0",
|
|
237
|
-
"hazo_ui": "^2.0.0",
|
|
238
|
-
"next": ">=14.0.0",
|
|
239
|
-
"next-auth": "^4.24.0",
|
|
240
|
-
"next-themes": "^0.4.0",
|
|
241
|
-
"react": "^18.0.0 || ^19.0.0",
|
|
242
|
-
"react-dom": "^18.0.0 || ^19.0.0",
|
|
243
|
-
"sonner": "^2.0.0",
|
|
244
233
|
"@radix-ui/react-accordion": "^1.2.0",
|
|
245
234
|
"@radix-ui/react-alert-dialog": "^1.1.0",
|
|
246
235
|
"@radix-ui/react-avatar": "^1.1.0",
|
|
@@ -255,7 +244,18 @@
|
|
|
255
244
|
"@radix-ui/react-switch": "^1.2.0",
|
|
256
245
|
"@radix-ui/react-tabs": "^1.1.0",
|
|
257
246
|
"@radix-ui/react-tooltip": "^1.2.0",
|
|
258
|
-
"
|
|
247
|
+
"hazo_config": "^1.4.0 || ^2.0.0",
|
|
248
|
+
"hazo_connect": "^2.4.0",
|
|
249
|
+
"hazo_logs": "^1.0.10",
|
|
250
|
+
"hazo_notify": "^1.0.0",
|
|
251
|
+
"hazo_ui": "^2.0.0",
|
|
252
|
+
"lucide-react": ">=0.400.0",
|
|
253
|
+
"next": ">=14.0.0",
|
|
254
|
+
"next-auth": "^4.24.0",
|
|
255
|
+
"next-themes": "^0.4.0",
|
|
256
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
257
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
258
|
+
"sonner": "^2.0.0"
|
|
259
259
|
},
|
|
260
260
|
"peerDependenciesMeta": {
|
|
261
261
|
"hazo_config": {
|
|
@@ -326,18 +326,7 @@
|
|
|
326
326
|
}
|
|
327
327
|
},
|
|
328
328
|
"devDependencies": {
|
|
329
|
-
"
|
|
330
|
-
"hazo_connect": "^2.4.2",
|
|
331
|
-
"hazo_logs": "^1.0.10",
|
|
332
|
-
"hazo_notify": "^1.0.0",
|
|
333
|
-
"hazo_ui": "^2.0.0",
|
|
334
|
-
"next": "^16.0.7",
|
|
335
|
-
"next-auth": "^4.24.13",
|
|
336
|
-
"next-themes": "^0.4.6",
|
|
337
|
-
"react": "^18.3.1",
|
|
338
|
-
"react-dom": "^18.3.1",
|
|
339
|
-
"sonner": "^2.0.7",
|
|
340
|
-
"lucide-react": "^0.553.0",
|
|
329
|
+
"@chromatic-com/storybook": "^4.1.2",
|
|
341
330
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
342
331
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
343
332
|
"@radix-ui/react-avatar": "^1.1.11",
|
|
@@ -352,7 +341,6 @@
|
|
|
352
341
|
"@radix-ui/react-switch": "^1.2.6",
|
|
353
342
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
354
343
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
355
|
-
"@chromatic-com/storybook": "^4.1.2",
|
|
356
344
|
"@storybook/addon-a11y": "^10.0.6",
|
|
357
345
|
"@storybook/addon-docs": "^10.0.6",
|
|
358
346
|
"@storybook/addon-onboarding": "^10.0.6",
|
|
@@ -375,14 +363,27 @@
|
|
|
375
363
|
"@types/react-dom": "^18",
|
|
376
364
|
"better-sqlite3": "^12.4.1",
|
|
377
365
|
"cross-env": "^10.1.0",
|
|
366
|
+
"dotenv": "^17.4.2",
|
|
378
367
|
"eslint": "^9.39.1",
|
|
379
368
|
"eslint-config-next": "^16.0.4",
|
|
380
369
|
"eslint-plugin-storybook": "^10.0.6",
|
|
370
|
+
"hazo_config": "^1.4.2",
|
|
371
|
+
"hazo_connect": "^2.4.2",
|
|
372
|
+
"hazo_logs": "^1.0.10",
|
|
373
|
+
"hazo_notify": "^1.0.0",
|
|
374
|
+
"hazo_ui": "^2.0.0",
|
|
381
375
|
"jest": "^30.2.0",
|
|
382
376
|
"jest-environment-jsdom": "^29.7.0",
|
|
377
|
+
"lucide-react": "^0.553.0",
|
|
378
|
+
"next": "^16.0.7",
|
|
379
|
+
"next-auth": "^4.24.13",
|
|
380
|
+
"next-themes": "^0.4.6",
|
|
383
381
|
"patch-package": "^8.0.1",
|
|
384
382
|
"playwright": "^1.57.0",
|
|
385
383
|
"postcss": "^8",
|
|
384
|
+
"react": "^18.3.1",
|
|
385
|
+
"react-dom": "^18.3.1",
|
|
386
|
+
"sonner": "^2.0.7",
|
|
386
387
|
"storybook": "^10.0.6",
|
|
387
388
|
"supertest": "^7.1.4",
|
|
388
389
|
"tailwindcss": "^3.4.1",
|