wexts 1.0.1
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 +443 -0
- package/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/chunk-2ZKONAXC.js +45 -0
- package/dist/chunk-2ZKONAXC.js.map +1 -0
- package/dist/chunk-57VDULE3.mjs +83 -0
- package/dist/chunk-57VDULE3.mjs.map +1 -0
- package/dist/chunk-6K3RXN4Y.mjs +45 -0
- package/dist/chunk-6K3RXN4Y.mjs.map +1 -0
- package/dist/chunk-6KN6UIHT.js +67 -0
- package/dist/chunk-6KN6UIHT.js.map +1 -0
- package/dist/chunk-A5OZK2TO.mjs +56 -0
- package/dist/chunk-A5OZK2TO.mjs.map +1 -0
- package/dist/chunk-ELVFG4US.js +83 -0
- package/dist/chunk-ELVFG4US.js.map +1 -0
- package/dist/chunk-H6XDQJ3N.mjs +11 -0
- package/dist/chunk-H6XDQJ3N.mjs.map +1 -0
- package/dist/chunk-HE3JQ62E.js +56 -0
- package/dist/chunk-HE3JQ62E.js.map +1 -0
- package/dist/chunk-HHXRAV67.mjs +229 -0
- package/dist/chunk-HHXRAV67.mjs.map +1 -0
- package/dist/chunk-J7J2LRG7.js +229 -0
- package/dist/chunk-J7J2LRG7.js.map +1 -0
- package/dist/chunk-LWNHEPTL.mjs +2 -0
- package/dist/chunk-LWNHEPTL.mjs.map +1 -0
- package/dist/chunk-MAVJYD6O.js +2 -0
- package/dist/chunk-MAVJYD6O.js.map +1 -0
- package/dist/chunk-QUV6QXTP.js +363 -0
- package/dist/chunk-QUV6QXTP.js.map +1 -0
- package/dist/chunk-WZBBQLFT.mjs +363 -0
- package/dist/chunk-WZBBQLFT.mjs.map +1 -0
- package/dist/chunk-XMPCR7N3.mjs +67 -0
- package/dist/chunk-XMPCR7N3.mjs.map +1 -0
- package/dist/cli/index.mjs +69 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/client/index.js +11 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +11 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/codegen-J3XOZCQZ.js +14 -0
- package/dist/codegen-J3XOZCQZ.js.map +1 -0
- package/dist/codegen-ZZBQIGUQ.mjs +14 -0
- package/dist/codegen-ZZBQIGUQ.mjs.map +1 -0
- package/dist/dev-server-K5YZAZY2.mjs +14 -0
- package/dist/dev-server-K5YZAZY2.mjs.map +1 -0
- package/dist/dev-server-X453DBCE.js +14 -0
- package/dist/dev-server-X453DBCE.js.map +1 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +274 -0
- package/dist/index.mjs.map +1 -0
- package/dist/nest/index.js +21 -0
- package/dist/nest/index.js.map +1 -0
- package/dist/nest/index.mjs +21 -0
- package/dist/nest/index.mjs.map +1 -0
- package/dist/next/index.js +14 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/index.mjs +14 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +3 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +104 -0
- package/templates/nestjs-api/.env.example +4 -0
- package/templates/nestjs-api/README.md +79 -0
- package/templates/nestjs-api/nest-cli.json +7 -0
- package/templates/nestjs-api/package.json +39 -0
- package/templates/nestjs-api/prisma/schema.prisma +29 -0
- package/templates/nestjs-api/src/app.module.ts +17 -0
- package/templates/nestjs-api/src/auth/auth.controller.ts +30 -0
- package/templates/nestjs-api/src/auth/auth.module.ts +26 -0
- package/templates/nestjs-api/src/auth/auth.service.ts +91 -0
- package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -0
- package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -0
- package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +19 -0
- package/templates/nestjs-api/src/main.ts +32 -0
- package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -0
- package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -0
- package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -0
- package/templates/nestjs-api/src/todos/todos.controller.ts +46 -0
- package/templates/nestjs-api/src/todos/todos.module.ts +9 -0
- package/templates/nestjs-api/src/todos/todos.service.ts +53 -0
- package/templates/nestjs-api/src/users/users.controller.ts +17 -0
- package/templates/nestjs-api/src/users/users.module.ts +10 -0
- package/templates/nestjs-api/src/users/users.service.ts +19 -0
- package/templates/nestjs-api/tsconfig.json +21 -0
- package/templates/nextjs-web/.env.local.example +1 -0
- package/templates/nextjs-web/README.md +68 -0
- package/templates/nextjs-web/app/dashboard/page.tsx +175 -0
- package/templates/nextjs-web/app/globals.css +28 -0
- package/templates/nextjs-web/app/layout.tsx +27 -0
- package/templates/nextjs-web/app/login/page.tsx +107 -0
- package/templates/nextjs-web/app/page.tsx +28 -0
- package/templates/nextjs-web/app/register/page.tsx +130 -0
- package/templates/nextjs-web/next.config.mjs +4 -0
- package/templates/nextjs-web/package.json +28 -0
- package/templates/nextjs-web/tailwind.config.ts +15 -0
- package/templates/nextjs-web/tsconfig.json +39 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, FormEvent } from 'react';
|
|
4
|
+
import { useFusion } from 'wexts/next';
|
|
5
|
+
import { useRouter } from 'next/navigation';
|
|
6
|
+
import Link from 'next/link';
|
|
7
|
+
|
|
8
|
+
export default function RegisterPage() {
|
|
9
|
+
const [email, setEmail] = useState('');
|
|
10
|
+
const [password, setPassword] = useState('');
|
|
11
|
+
const [name, setName] = useState('');
|
|
12
|
+
const [error, setError] = useState('');
|
|
13
|
+
const [loading, setLoading] = useState(false);
|
|
14
|
+
|
|
15
|
+
const { client } = useFusion();
|
|
16
|
+
const router = useRouter();
|
|
17
|
+
|
|
18
|
+
const handleSubmit = async (e: FormEvent) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
setError('');
|
|
21
|
+
setLoading(true);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const response = await client.post<{ token: string; user: any }>('/auth/register', {
|
|
25
|
+
email,
|
|
26
|
+
password,
|
|
27
|
+
name,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
localStorage.setItem('fusion_token', response.token);
|
|
31
|
+
router.push('/dashboard');
|
|
32
|
+
} catch (err: any) {
|
|
33
|
+
setError(err.message || 'Registration failed');
|
|
34
|
+
} finally {
|
|
35
|
+
setLoading(false);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div className="min-h-screen flex items-center justify-center bg-gradient-to-br from-violet-50 to-purple-100 dark:from-gray-900 dark:to-gray-800 px-4">
|
|
41
|
+
<div className="max-w-md w-full space-y-8 bg-white dark:bg-gray-800 p-10 rounded-2xl shadow-xl">
|
|
42
|
+
<div>
|
|
43
|
+
<h2 className="text-center text-4xl font-bold text-gray-900 dark:text-white">
|
|
44
|
+
Create Account
|
|
45
|
+
</h2>
|
|
46
|
+
<p className="mt-2 text-center text-sm text-gray-600 dark:text-gray-400">
|
|
47
|
+
Get started with Fusion
|
|
48
|
+
</p>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<form className="mt-8 space-y-6" onSubmit={handleSubmit}>
|
|
52
|
+
{error && (
|
|
53
|
+
<div className="rounded-lg bg-red-50 dark:bg-red-900/20 p-4 text-sm text-red-600 dark:text-red-400">
|
|
54
|
+
{error}
|
|
55
|
+
</div>
|
|
56
|
+
)}
|
|
57
|
+
|
|
58
|
+
<div className="space-y-4">
|
|
59
|
+
<div>
|
|
60
|
+
<label htmlFor="name" className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
|
61
|
+
Name (optional)
|
|
62
|
+
</label>
|
|
63
|
+
<input
|
|
64
|
+
id="name"
|
|
65
|
+
name="name"
|
|
66
|
+
type="text"
|
|
67
|
+
value={name}
|
|
68
|
+
onChange={(e) => setName(e.target.value)}
|
|
69
|
+
className="appearance-none relative block w-full px-4 py-3 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent bg-white dark:bg-gray-700 transition"
|
|
70
|
+
placeholder="John Doe"
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div>
|
|
75
|
+
<label htmlFor="email" className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
|
76
|
+
Email
|
|
77
|
+
</label>
|
|
78
|
+
<input
|
|
79
|
+
id="email"
|
|
80
|
+
name="email"
|
|
81
|
+
type="email"
|
|
82
|
+
autoComplete="email"
|
|
83
|
+
required
|
|
84
|
+
value={email}
|
|
85
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
86
|
+
className="appearance-none relative block w-full px-4 py-3 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent bg-white dark:bg-gray-700 transition"
|
|
87
|
+
placeholder="you@example.com"
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div>
|
|
92
|
+
<label htmlFor="password" className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
|
93
|
+
Password
|
|
94
|
+
</label>
|
|
95
|
+
<input
|
|
96
|
+
id="password"
|
|
97
|
+
name="password"
|
|
98
|
+
type="password"
|
|
99
|
+
autoComplete="new-password"
|
|
100
|
+
required
|
|
101
|
+
value={password}
|
|
102
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
103
|
+
className="appearance-none relative block w-full px-4 py-3 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-violet-500 focus:border-transparent bg-white dark:bg-gray-700 transition"
|
|
104
|
+
placeholder="••••••••"
|
|
105
|
+
/>
|
|
106
|
+
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400">Minimum 6 characters</p>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div>
|
|
111
|
+
<button
|
|
112
|
+
type="submit"
|
|
113
|
+
disabled={loading}
|
|
114
|
+
className="group relative w-full flex justify-center py-3 px-4 border border-transparent text-sm font-semibold rounded-lg text-white bg-violet-600 hover:bg-violet-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-violet-500 disabled:opacity-50 disabled:cursor-not-allowed transition-all"
|
|
115
|
+
>
|
|
116
|
+
{loading ? 'Creating account...' : 'Sign up'}
|
|
117
|
+
</button>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div className="text-center text-sm">
|
|
121
|
+
<span className="text-gray-600 dark:text-gray-400">Already have an account? </span>
|
|
122
|
+
<Link href="/login" className="font-medium text-violet-600 hover:text-violet-500 dark:text-violet-400">
|
|
123
|
+
Sign in
|
|
124
|
+
</Link>
|
|
125
|
+
</div>
|
|
126
|
+
</form>
|
|
127
|
+
</div>
|
|
128
|
+
</div>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fusion-web",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"lint": "next lint"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"react": "^19.2.0",
|
|
13
|
+
"react-dom": "^19.2.0",
|
|
14
|
+
"next": "^16.0.0",
|
|
15
|
+
"wexts": "^1.0.0",
|
|
16
|
+
"clsx": "^2.1.0",
|
|
17
|
+
"tailwind-merge": "^2.2.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^20.11.0",
|
|
21
|
+
"@types/react": "^18.2.0",
|
|
22
|
+
"@types/react-dom": "^18.2.0",
|
|
23
|
+
"typescript": "^5.3.3",
|
|
24
|
+
"tailwindcss": "^4.1.0",
|
|
25
|
+
"postcss": "^8.4.0",
|
|
26
|
+
"autoprefixer": "^10.4.0"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Config } from 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
content: [
|
|
5
|
+
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
+
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
7
|
+
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
8
|
+
],
|
|
9
|
+
theme: {
|
|
10
|
+
extend: {},
|
|
11
|
+
},
|
|
12
|
+
plugins: [],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default config;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"lib": [
|
|
4
|
+
"dom",
|
|
5
|
+
"dom.iterable",
|
|
6
|
+
"esnext"
|
|
7
|
+
],
|
|
8
|
+
"allowJs": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"esModuleInterop": true,
|
|
13
|
+
"module": "esnext",
|
|
14
|
+
"moduleResolution": "bundler",
|
|
15
|
+
"resolveJsonModule": true,
|
|
16
|
+
"isolatedModules": true,
|
|
17
|
+
"jsx": "preserve",
|
|
18
|
+
"incremental": true,
|
|
19
|
+
"plugins": [
|
|
20
|
+
{
|
|
21
|
+
"name": "next"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"paths": {
|
|
25
|
+
"@/*": [
|
|
26
|
+
"./*"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"include": [
|
|
31
|
+
"next-env.d.ts",
|
|
32
|
+
"**/*.ts",
|
|
33
|
+
"**/*.tsx",
|
|
34
|
+
".next/types/**/*.ts"
|
|
35
|
+
],
|
|
36
|
+
"exclude": [
|
|
37
|
+
"node_modules"
|
|
38
|
+
]
|
|
39
|
+
}
|