baraqex 1.0.74 → 2.0.0
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/CHANGELOG.md +73 -0
- package/README.md +272 -472
- package/bin/baraqex.js +150 -12
- package/dist/browser.d.ts +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2319 -205
- package/dist/browser.js.map +4 -4
- package/dist/core/batch.d.ts +10 -0
- package/dist/core/batch.d.ts.map +1 -0
- package/dist/core/component.d.ts +69 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/context.d.ts +22 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/errors.d.ts +125 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/event-bus.d.ts +29 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/forms.d.ts +128 -0
- package/dist/core/forms.d.ts.map +1 -0
- package/dist/core/hooks.d.ts +84 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/jsx-runtime.d.ts +45 -0
- package/dist/core/jsx-runtime.d.ts.map +1 -0
- package/dist/core/lifecycle-events.d.ts +71 -0
- package/dist/core/lifecycle-events.d.ts.map +1 -0
- package/dist/core/renderer.d.ts +39 -0
- package/dist/core/renderer.d.ts.map +1 -0
- package/dist/core/router.d.ts +108 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/server-renderer.d.ts +26 -0
- package/dist/core/server-renderer.d.ts.map +1 -0
- package/dist/core/store.d.ts +102 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/types.d.ts +66 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/utils.d.ts +153 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/vdom.d.ts +29 -0
- package/dist/core/vdom.d.ts.map +1 -0
- package/dist/index.d.ts +39 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2592 -508
- package/dist/index.js.map +4 -4
- package/dist/server/auth.d.ts +8 -3
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +173 -112
- package/dist/server/index.js.map +4 -4
- package/dist/server/middleware.d.ts +10 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/package.json +224 -124
- package/templates/basic-app/src/main.jsx +336 -0
- package/templates/complete-app/api/hello.js +0 -0
- package/templates/complete-app/client.js +58 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +18 -0
- package/templates/complete-app/pages/about.js +119 -0
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.js +157 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.js +290 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +89 -0
- package/templates/complete-app/public/index.html +118 -0
- package/templates/complete-app/public/styles.css +76 -0
- package/templates/complete-app/readme.md +188 -0
- package/templates/complete-app/server.js +226 -0
- package/templates/complete-app/server.ts +275 -0
- package/templates/complete-app/src/App.tsx +59 -0
- package/templates/complete-app/src/client.ts +61 -0
- package/templates/complete-app/src/client.tsx +18 -0
- package/templates/complete-app/src/pages/index.tsx +51 -0
- package/templates/complete-app/src/server.ts +218 -0
- package/templates/complete-app/tsconfig.json +22 -0
- package/templates/complete-app/tsconfig.server.json +19 -0
- package/templates/complete-app/vite.config.js +57 -0
- package/templates/complete-app/vite.config.ts +30 -0
- package/templates/complete-app/wasm/build.bat +0 -0
- package/templates/complete-app/wasm/build.sh +0 -0
- package/templates/complete-app/wasm/example.go +0 -0
- package/templates/fullstack-app/README.md +37 -0
- package/templates/fullstack-app/api/hello.js +11 -0
- package/templates/fullstack-app/api/hello.ts +18 -0
- package/templates/fullstack-app/api/users/[id].ts +73 -0
- package/templates/fullstack-app/api/users/index.ts +32 -0
- package/templates/fullstack-app/build/main.css +874 -0
- package/templates/fullstack-app/build/main.css.map +7 -0
- package/templates/fullstack-app/build/main.js +967 -0
- package/templates/fullstack-app/build/main.js.map +7 -0
- package/templates/fullstack-app/build.ts +210 -0
- package/templates/fullstack-app/index.html +36 -0
- package/templates/fullstack-app/package.json +35 -0
- package/templates/fullstack-app/postcss.config.js +6 -0
- package/templates/fullstack-app/process-tailwind.js +45 -0
- package/templates/fullstack-app/public/_redirects +1 -0
- package/templates/fullstack-app/public/route-handler.js +47 -0
- package/templates/fullstack-app/public/spa-fix.html +17 -0
- package/templates/fullstack-app/public/styles.css +975 -0
- package/templates/fullstack-app/public/tailwind.css +15 -0
- package/templates/fullstack-app/server.js +267 -0
- package/templates/fullstack-app/server.ts +474 -0
- package/templates/fullstack-app/src/README.md +55 -0
- package/templates/fullstack-app/src/client.js +87 -0
- package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
- package/templates/fullstack-app/src/components/Layout.tsx +42 -0
- package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
- package/templates/fullstack-app/src/components/UserList.tsx +44 -0
- package/templates/fullstack-app/src/config.ts +42 -0
- package/templates/fullstack-app/src/data/api.ts +206 -0
- package/templates/fullstack-app/src/main.tsx +155 -0
- package/templates/fullstack-app/src/middleware.ts +28 -0
- package/templates/fullstack-app/src/pages/404.tsx +28 -0
- package/templates/fullstack-app/src/pages/[id].tsx +0 -0
- package/templates/fullstack-app/src/pages/_app.tsx +11 -0
- package/templates/fullstack-app/src/pages/_document.tsx +25 -0
- package/templates/fullstack-app/src/pages/_error.tsx +45 -0
- package/templates/fullstack-app/src/pages/about/index.tsx +67 -0
- package/templates/fullstack-app/src/pages/about.tsx +71 -0
- package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
- package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
- package/templates/fullstack-app/src/pages/index.tsx +110 -0
- package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
- package/templates/fullstack-app/src/pages/users.tsx +60 -0
- package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
- package/templates/fullstack-app/src/router.ts +255 -0
- package/templates/fullstack-app/src/styles.css +5 -0
- package/templates/fullstack-app/tailwind.config.js +11 -0
- package/templates/fullstack-app/tsconfig.json +18 -0
- package/templates/fullstack-app/vite.config.js +87 -0
- package/templates/go/build.bat +36 -0
- package/templates/go/build.sh +43 -0
- package/templates/go/example.go +205 -0
- package/templates/go-wasm-app/README.md +38 -0
- package/templates/go-wasm-app/babel.config.js +21 -0
- package/templates/go-wasm-app/build-client.js +49 -0
- package/templates/go-wasm-app/build-wasm.js +237 -0
- package/templates/go-wasm-app/build.config.js +62 -0
- package/templates/go-wasm-app/build.js +218 -0
- package/templates/go-wasm-app/package.json +32 -0
- package/templates/go-wasm-app/public/index.html +128 -0
- package/templates/go-wasm-app/public/styles.css +197 -0
- package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec.js +561 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +39 -0
- package/templates/go-wasm-app/server.js +70 -0
- package/templates/go-wasm-app/src/App.jsx +38 -0
- package/templates/go-wasm-app/src/app.js +173 -0
- package/templates/go-wasm-app/src/client.js +57 -0
- package/templates/go-wasm-app/src/components/Footer.jsx +13 -0
- package/templates/go-wasm-app/src/components/Header.jsx +19 -0
- package/templates/go-wasm-app/src/components/WasmDemo.jsx +120 -0
- package/templates/go-wasm-app/src/main.jsx +12 -0
- package/templates/go-wasm-app/src/wasm/example.go +75 -0
- package/templates/go-wasm-app/tsconfig.server.json +18 -0
- package/templates/go-wasm-app/vite.config.js +45 -0
- package/templates/ssr-template/package.json +16 -10
- package/templates/wasm/package.json +43 -43
- package/templates/wasm/src/App.tsx +2 -2
- package/dist/forms/index.d.ts +0 -2
- package/dist/forms/index.d.ts.map +0 -1
- package/dist/forms/types.d.ts +0 -2
- package/dist/forms/types.d.ts.map +0 -1
- package/dist/frontend/components/WasmLoader.d.ts +0 -2
- package/dist/frontend/components/WasmLoader.d.ts.map +0 -1
- package/dist/frontend/hooks/useWasm.d.ts +0 -2
- package/dist/frontend/hooks/useWasm.d.ts.map +0 -1
- package/dist/frontend/index.d.ts +0 -2
- package/dist/frontend/index.d.ts.map +0 -1
- package/dist/router/index.d.ts +0 -2
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/types.d.ts +0 -2
- package/dist/router/types.d.ts.map +0 -1
- package/dist/store/index.d.ts +0 -2
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/types.d.ts +0 -2
- package/dist/store/types.d.ts.map +0 -1
- package/templates/basic-app/package-lock.json +0 -7173
- package/templates/fullstack-template/package-lock.json +0 -3558
- package/templates/ssr-template/package-lock.json +0 -5380
- package/templates/wasm/package-lock.json +0 -5347
- package/templates/wasm/public/example.wasm +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["DOM", "DOM.Iterable", "ESNext"],
|
|
6
|
+
"allowJs": false,
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"allowSyntheticDefaultImports": true,
|
|
10
|
+
"strict": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"module": "ESNext",
|
|
13
|
+
"moduleResolution": "Node",
|
|
14
|
+
"resolveJsonModule": true,
|
|
15
|
+
"isolatedModules": true,
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
"jsx": "preserve",
|
|
18
|
+
"jsxFactory": "createElement",
|
|
19
|
+
"jsxFragmentFactory": "Fragment"
|
|
20
|
+
},
|
|
21
|
+
"include": ["src"]
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"target": "ES2020",
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"outDir": "./dist/server",
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"sourceMap": true,
|
|
11
|
+
"strict": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"jsx": "react",
|
|
14
|
+
"jsxFactory": "createElement",
|
|
15
|
+
"jsxFragmentFactory": "Fragment"
|
|
16
|
+
},
|
|
17
|
+
"include": ["server.ts", "src/pages/**/*.tsx"],
|
|
18
|
+
"exclude": ["node_modules", "dist"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
// Configure JSX
|
|
6
|
+
esbuild: {
|
|
7
|
+
jsxFactory: 'createElement',
|
|
8
|
+
jsxFragment: 'Fragment',
|
|
9
|
+
jsxInject: `import { createElement, Fragment } from 'frontend-hamroun'`
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
// Configure build
|
|
13
|
+
build: {
|
|
14
|
+
outDir: 'dist/public',
|
|
15
|
+
emptyOutDir: true,
|
|
16
|
+
rollupOptions: {
|
|
17
|
+
input: {
|
|
18
|
+
client: resolve(__dirname, 'src/client.ts')
|
|
19
|
+
},
|
|
20
|
+
output: [
|
|
21
|
+
{
|
|
22
|
+
// ESM output
|
|
23
|
+
entryFileNames: 'assets/[name].mjs',
|
|
24
|
+
chunkFileNames: 'assets/[name]-[hash].mjs',
|
|
25
|
+
assetFileNames: 'assets/[name]-[hash].[ext]',
|
|
26
|
+
format: 'es',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
// CommonJS output
|
|
30
|
+
entryFileNames: 'assets/[name].js',
|
|
31
|
+
chunkFileNames: 'assets/[name]-[hash].js',
|
|
32
|
+
assetFileNames: 'assets/[name]-[hash].[ext]',
|
|
33
|
+
format: 'cjs',
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
// Add optimizations for frontend-hamroun
|
|
40
|
+
optimizeDeps: {
|
|
41
|
+
include: ['frontend-hamroun']
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
// Resolve aliases for better imports
|
|
45
|
+
resolve: {
|
|
46
|
+
alias: {
|
|
47
|
+
'@': resolve(__dirname, 'src')
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
// Development server
|
|
52
|
+
server: {
|
|
53
|
+
proxy: {
|
|
54
|
+
'/api': 'http://localhost:3000'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
resolve: {
|
|
6
|
+
alias: {
|
|
7
|
+
'frontend-hamroun': path.resolve(__dirname, 'node_modules/frontend-hamroun')
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
build: {
|
|
11
|
+
outDir: 'dist',
|
|
12
|
+
ssr: 'src/server.ts',
|
|
13
|
+
rollupOptions: {
|
|
14
|
+
input: {
|
|
15
|
+
client: './src/client.tsx',
|
|
16
|
+
server: './src/server.ts'
|
|
17
|
+
},
|
|
18
|
+
output: {
|
|
19
|
+
entryFileNames: '[name].js',
|
|
20
|
+
chunkFileNames: 'assets/[name]-[hash].js',
|
|
21
|
+
assetFileNames: 'assets/[name]-[hash].[ext]'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
esbuild: {
|
|
26
|
+
jsxFactory: '_jsx',
|
|
27
|
+
jsxFragment: '_Fragment',
|
|
28
|
+
jsxInject: `import { jsx as _jsx, Fragment as _Fragment } from 'frontend-hamroun'`
|
|
29
|
+
}
|
|
30
|
+
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Frontend Hamroun Fullstack Template
|
|
2
|
+
|
|
3
|
+
A dynamic, customizable fullstack template with automatic routing.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
1. Install dependencies:
|
|
8
|
+
```
|
|
9
|
+
npm install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
2. Run the development server:
|
|
13
|
+
```
|
|
14
|
+
npm run dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
3. Build for production:
|
|
18
|
+
```
|
|
19
|
+
npm run build
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
4. Run in production mode:
|
|
23
|
+
```
|
|
24
|
+
npm start
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Customizing Without Touching Core Files
|
|
28
|
+
|
|
29
|
+
This template is designed to be customized without modifying the core server or app files:
|
|
30
|
+
|
|
31
|
+
1. **Configuration**: Edit `src/config.ts` to change app settings
|
|
32
|
+
2. **Pages**: Add new pages in `src/pages` - they become routes automatically
|
|
33
|
+
3. **Components**: Create reusable components in `src/components`
|
|
34
|
+
4. **API Endpoints**: Add new API endpoints in `src/data/api.ts`
|
|
35
|
+
|
|
36
|
+
## File Structure
|
|
37
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
export const get = (req: Request, res: Response) => {
|
|
4
|
+
res.json({
|
|
5
|
+
message: 'Hello from the API!',
|
|
6
|
+
timestamp: new Date().toISOString()
|
|
7
|
+
});
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const post = (req: Request, res: Response) => {
|
|
11
|
+
const { name = 'Guest' } = req.body;
|
|
12
|
+
|
|
13
|
+
res.json({
|
|
14
|
+
message: `Hello, ${name}!`,
|
|
15
|
+
timestamp: new Date().toISOString(),
|
|
16
|
+
receivedData: req.body
|
|
17
|
+
});
|
|
18
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
// Mock user database - same as in index.ts for simplicity
|
|
4
|
+
const users = [
|
|
5
|
+
{ id: 1, name: 'User 1', email: 'user1@example.com' },
|
|
6
|
+
{ id: 2, name: 'User 2', email: 'user2@example.com' },
|
|
7
|
+
{ id: 3, name: 'User 3', email: 'user3@example.com' }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const get = (req: Request, res: Response) => {
|
|
11
|
+
const userId = parseInt(req.params.id);
|
|
12
|
+
|
|
13
|
+
if (isNaN(userId)) {
|
|
14
|
+
return res.status(400).json({ error: 'Invalid user ID' });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const user = users.find(u => u.id === userId);
|
|
18
|
+
|
|
19
|
+
if (!user) {
|
|
20
|
+
return res.status(404).json({ error: 'User not found' });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
res.json(user);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const put = (req: Request, res: Response) => {
|
|
27
|
+
const userId = parseInt(req.params.id);
|
|
28
|
+
|
|
29
|
+
if (isNaN(userId)) {
|
|
30
|
+
return res.status(400).json({ error: 'Invalid user ID' });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const userIndex = users.findIndex(u => u.id === userId);
|
|
34
|
+
|
|
35
|
+
if (userIndex === -1) {
|
|
36
|
+
return res.status(404).json({ error: 'User not found' });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const { name, email } = req.body;
|
|
40
|
+
|
|
41
|
+
if (!name && !email) {
|
|
42
|
+
return res.status(400).json({ error: 'Name or email must be provided' });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Update the user
|
|
46
|
+
users[userIndex] = {
|
|
47
|
+
...users[userIndex],
|
|
48
|
+
...(name && { name }),
|
|
49
|
+
...(email && { email })
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
res.json(users[userIndex]);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const delete_ = (req: Request, res: Response) => {
|
|
56
|
+
const userId = parseInt(req.params.id);
|
|
57
|
+
|
|
58
|
+
if (isNaN(userId)) {
|
|
59
|
+
return res.status(400).json({ error: 'Invalid user ID' });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const userIndex = users.findIndex(u => u.id === userId);
|
|
63
|
+
|
|
64
|
+
if (userIndex === -1) {
|
|
65
|
+
return res.status(404).json({ error: 'User not found' });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Remove the user
|
|
69
|
+
const deletedUser = users[userIndex];
|
|
70
|
+
users.splice(userIndex, 1);
|
|
71
|
+
|
|
72
|
+
res.json({ success: true, deletedUser });
|
|
73
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
// Mock user database
|
|
4
|
+
const users = [
|
|
5
|
+
{ id: 1, name: 'User 1', email: 'user1@example.com' },
|
|
6
|
+
{ id: 2, name: 'User 2', email: 'user2@example.com' },
|
|
7
|
+
{ id: 3, name: 'User 3', email: 'user3@example.com' }
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const get = (req: Request, res: Response) => {
|
|
11
|
+
// Return users without sensitive information
|
|
12
|
+
const safeUsers = users.map(({ id, name, email }) => ({ id, name, email }));
|
|
13
|
+
res.json(safeUsers);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const post = (req: Request, res: Response) => {
|
|
17
|
+
const { name, email } = req.body;
|
|
18
|
+
|
|
19
|
+
if (!name || !email) {
|
|
20
|
+
return res.status(400).json({ error: 'Name and email are required' });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// In a real app, validate data and save to database
|
|
24
|
+
const newUser = {
|
|
25
|
+
id: users.length + 1,
|
|
26
|
+
name,
|
|
27
|
+
email
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
users.push(newUser);
|
|
31
|
+
res.status(201).json(newUser);
|
|
32
|
+
};
|