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.
Files changed (99) hide show
  1. package/README.md +443 -0
  2. package/dist/chunk-2H7UOFLK.js +11 -0
  3. package/dist/chunk-2H7UOFLK.js.map +1 -0
  4. package/dist/chunk-2ZKONAXC.js +45 -0
  5. package/dist/chunk-2ZKONAXC.js.map +1 -0
  6. package/dist/chunk-57VDULE3.mjs +83 -0
  7. package/dist/chunk-57VDULE3.mjs.map +1 -0
  8. package/dist/chunk-6K3RXN4Y.mjs +45 -0
  9. package/dist/chunk-6K3RXN4Y.mjs.map +1 -0
  10. package/dist/chunk-6KN6UIHT.js +67 -0
  11. package/dist/chunk-6KN6UIHT.js.map +1 -0
  12. package/dist/chunk-A5OZK2TO.mjs +56 -0
  13. package/dist/chunk-A5OZK2TO.mjs.map +1 -0
  14. package/dist/chunk-ELVFG4US.js +83 -0
  15. package/dist/chunk-ELVFG4US.js.map +1 -0
  16. package/dist/chunk-H6XDQJ3N.mjs +11 -0
  17. package/dist/chunk-H6XDQJ3N.mjs.map +1 -0
  18. package/dist/chunk-HE3JQ62E.js +56 -0
  19. package/dist/chunk-HE3JQ62E.js.map +1 -0
  20. package/dist/chunk-HHXRAV67.mjs +229 -0
  21. package/dist/chunk-HHXRAV67.mjs.map +1 -0
  22. package/dist/chunk-J7J2LRG7.js +229 -0
  23. package/dist/chunk-J7J2LRG7.js.map +1 -0
  24. package/dist/chunk-LWNHEPTL.mjs +2 -0
  25. package/dist/chunk-LWNHEPTL.mjs.map +1 -0
  26. package/dist/chunk-MAVJYD6O.js +2 -0
  27. package/dist/chunk-MAVJYD6O.js.map +1 -0
  28. package/dist/chunk-QUV6QXTP.js +363 -0
  29. package/dist/chunk-QUV6QXTP.js.map +1 -0
  30. package/dist/chunk-WZBBQLFT.mjs +363 -0
  31. package/dist/chunk-WZBBQLFT.mjs.map +1 -0
  32. package/dist/chunk-XMPCR7N3.mjs +67 -0
  33. package/dist/chunk-XMPCR7N3.mjs.map +1 -0
  34. package/dist/cli/index.mjs +69 -0
  35. package/dist/cli/index.mjs.map +1 -0
  36. package/dist/client/index.js +11 -0
  37. package/dist/client/index.js.map +1 -0
  38. package/dist/client/index.mjs +11 -0
  39. package/dist/client/index.mjs.map +1 -0
  40. package/dist/codegen-J3XOZCQZ.js +14 -0
  41. package/dist/codegen-J3XOZCQZ.js.map +1 -0
  42. package/dist/codegen-ZZBQIGUQ.mjs +14 -0
  43. package/dist/codegen-ZZBQIGUQ.mjs.map +1 -0
  44. package/dist/dev-server-K5YZAZY2.mjs +14 -0
  45. package/dist/dev-server-K5YZAZY2.mjs.map +1 -0
  46. package/dist/dev-server-X453DBCE.js +14 -0
  47. package/dist/dev-server-X453DBCE.js.map +1 -0
  48. package/dist/index.js +274 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/index.mjs +274 -0
  51. package/dist/index.mjs.map +1 -0
  52. package/dist/nest/index.js +21 -0
  53. package/dist/nest/index.js.map +1 -0
  54. package/dist/nest/index.mjs +21 -0
  55. package/dist/nest/index.mjs.map +1 -0
  56. package/dist/next/index.js +14 -0
  57. package/dist/next/index.js.map +1 -0
  58. package/dist/next/index.mjs +14 -0
  59. package/dist/next/index.mjs.map +1 -0
  60. package/dist/types/index.js +3 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/types/index.mjs +3 -0
  63. package/dist/types/index.mjs.map +1 -0
  64. package/package.json +104 -0
  65. package/templates/nestjs-api/.env.example +4 -0
  66. package/templates/nestjs-api/README.md +79 -0
  67. package/templates/nestjs-api/nest-cli.json +7 -0
  68. package/templates/nestjs-api/package.json +39 -0
  69. package/templates/nestjs-api/prisma/schema.prisma +29 -0
  70. package/templates/nestjs-api/src/app.module.ts +17 -0
  71. package/templates/nestjs-api/src/auth/auth.controller.ts +30 -0
  72. package/templates/nestjs-api/src/auth/auth.module.ts +26 -0
  73. package/templates/nestjs-api/src/auth/auth.service.ts +91 -0
  74. package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -0
  75. package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -0
  76. package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +19 -0
  77. package/templates/nestjs-api/src/main.ts +32 -0
  78. package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -0
  79. package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -0
  80. package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -0
  81. package/templates/nestjs-api/src/todos/todos.controller.ts +46 -0
  82. package/templates/nestjs-api/src/todos/todos.module.ts +9 -0
  83. package/templates/nestjs-api/src/todos/todos.service.ts +53 -0
  84. package/templates/nestjs-api/src/users/users.controller.ts +17 -0
  85. package/templates/nestjs-api/src/users/users.module.ts +10 -0
  86. package/templates/nestjs-api/src/users/users.service.ts +19 -0
  87. package/templates/nestjs-api/tsconfig.json +21 -0
  88. package/templates/nextjs-web/.env.local.example +1 -0
  89. package/templates/nextjs-web/README.md +68 -0
  90. package/templates/nextjs-web/app/dashboard/page.tsx +175 -0
  91. package/templates/nextjs-web/app/globals.css +28 -0
  92. package/templates/nextjs-web/app/layout.tsx +27 -0
  93. package/templates/nextjs-web/app/login/page.tsx +107 -0
  94. package/templates/nextjs-web/app/page.tsx +28 -0
  95. package/templates/nextjs-web/app/register/page.tsx +130 -0
  96. package/templates/nextjs-web/next.config.mjs +4 -0
  97. package/templates/nextjs-web/package.json +28 -0
  98. package/templates/nextjs-web/tailwind.config.ts +15 -0
  99. 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,4 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {};
3
+
4
+ export default nextConfig;
@@ -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
+ }