frgen 0.3.7 → 0.4.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/README.md +384 -30
- package/lib/file.gen.js +2 -0
- package/lib/main.js +1 -1
- package/lib/make_controller.js +1 -1
- package/lib/make_crud.js +1 -1
- package/lib/make_resource.js +1 -1
- package/lib/make_service.js +1 -1
- package/lib/make_validation.js +1 -1
- package/lib/mui.gen.js +1 -1
- package/lib/regen.js +1 -1
- package/lib/utils.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,65 +1,419 @@
|
|
|
1
|
-
|
|
1
|
+
# 🧰 FRGEN — CLI CRUD Generator
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
`frgen` is a **Command Line Tool** that automatically generates boilerplate files such as **models**, **controllers**, **services**, **validations**, and **resources** based on your database table structure.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📦 Installation
|
|
8
|
+
|
|
9
|
+
If published on npm, you can run it directly using:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx frgen <action> [options...]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
```bash
|
|
17
|
+
npx frgen make:controller --table=users --path=modules/users
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Or install it globally (optional):
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g frgen
|
|
24
|
+
frgen make:crud --pg
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## ⚙️ General Options
|
|
30
|
+
|
|
31
|
+
| Option | Description | Example |
|
|
32
|
+
|--------|--------------|----------|
|
|
33
|
+
| `--table=<table_name>` | The table name used as the generation base | `--table=users` |
|
|
34
|
+
| `--schema=<schema_name>` | (Optional) Database schema, default `public` | `--schema=my_schema` |
|
|
35
|
+
| `--path=<output_folder>` | (Optional) Output file path | `--path=modules/user` |
|
|
36
|
+
| `--prisma` | Use Prisma ORM | `--prisma` |
|
|
37
|
+
| `--pg` | Use PostgreSQL client | `--pg` |
|
|
38
|
+
| `--mysql` | Use MySQL client | `--mysql` |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 🧩 Available Actions
|
|
43
|
+
|
|
44
|
+
### 1. `make:model`
|
|
45
|
+
Generates a **model** file based on the database table structure.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx frgen make:model --table=users --schema=public
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Process:**
|
|
52
|
+
- Reads the table structure from the database
|
|
53
|
+
- Generates a PascalCase model name
|
|
54
|
+
- Saves it in the default path or the specified `--path`
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### 2. `make:resource`
|
|
59
|
+
Generates a **resource** file (usually a DTO or response mapper).
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npx frgen make:resource --table=products
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### 3. `make:controller`
|
|
68
|
+
Generates a complete set of files including:
|
|
69
|
+
- Controller
|
|
70
|
+
- Service
|
|
71
|
+
- Validation
|
|
72
|
+
- Resource
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx frgen make:controller --table=users --path=modules/users
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Steps performed:**
|
|
79
|
+
1. `generateController()`
|
|
80
|
+
2. `generateService()`
|
|
81
|
+
3. `generateValidation()`
|
|
82
|
+
4. `generateContent()`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 4. `make:crud`
|
|
87
|
+
Generates a full CRUD structure at once, including:
|
|
88
|
+
- Model
|
|
89
|
+
- Controller
|
|
90
|
+
- Service
|
|
91
|
+
- Validation
|
|
92
|
+
- Resource
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx frgen make:crud --pg --schema=public
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Use this to generate the full CRUD boilerplate automatically.**
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### 5. `make:validation`
|
|
103
|
+
Generates an automatic **validation** file based on table structure.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npx frgen make:validation --table=orders
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### 6. `make:service`
|
|
112
|
+
Generates a **service layer** file for business logic.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
npx frgen make:service --table=users --path=modules/users
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 🧠 Internal Explanation
|
|
121
|
+
|
|
122
|
+
### Key Variables
|
|
123
|
+
|
|
124
|
+
| Variable | Description |
|
|
125
|
+
|-----------|--------------|
|
|
126
|
+
| `action` | Main command (`make:model`, `make:crud`, etc.) |
|
|
127
|
+
| `tableName` | Target table name |
|
|
128
|
+
| `_path` | Output path for generated files |
|
|
129
|
+
| `schema` | Database schema (default: `public`) |
|
|
130
|
+
| `client` | Database client (`pg` or `mysql`) |
|
|
131
|
+
| `prisma` | Boolean, whether Prisma ORM is used |
|
|
132
|
+
| `pool` | Active database connection |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### Execution Flow of `frgen`
|
|
137
|
+
|
|
138
|
+
1. Parse CLI arguments
|
|
139
|
+
2. Set `DB_CLIENT` according to the option (`pg` or `mysql`)
|
|
140
|
+
3. Create a database connection using `db.createPool()`
|
|
141
|
+
4. Check database connectivity with `checkDatabaseConnection()`
|
|
142
|
+
5. Execute action based on the command:
|
|
143
|
+
- `make:model` → `generateModelContent()`
|
|
144
|
+
- `make:controller` → `generateController()`, `generateService()`, etc.
|
|
145
|
+
- `make:crud` → `generateAll()`
|
|
146
|
+
6. Close the database connection (`pool.end()` / `pool.releaseConnection()`)
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 💡 Full Examples
|
|
151
|
+
|
|
152
|
+
### PostgreSQL
|
|
153
|
+
```bash
|
|
154
|
+
npx frgen make:controller --table=users --schema=public --pg --path=modules/users
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### MySQL
|
|
158
|
+
```bash
|
|
159
|
+
npx frgen make:crud --mysql --path=modules/user
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### With Prisma
|
|
163
|
+
```bash
|
|
164
|
+
npx frgen make:service --table=products --path=modules/products --prisma
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 🧱 Internal Dependencies
|
|
170
|
+
|
|
171
|
+
| File | Description |
|
|
172
|
+
|------|--------------|
|
|
173
|
+
| `./db.js` | Database connection utility |
|
|
174
|
+
| `./utils.js` | Utility functions: `checkDatabaseConnection`, `removePluralSuffix`, `toPascalCase` |
|
|
175
|
+
| `./make:model.js` | Model generator |
|
|
176
|
+
| `./make:controller.js` | Controller generator |
|
|
177
|
+
| `./make:service.js` | Service generator |
|
|
178
|
+
| `./make:validation.js` | Validation generator |
|
|
179
|
+
| `./make:resource.js` | Resource generator |
|
|
180
|
+
| `./make:crud.js` | Full CRUD generator |
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 🧨 Error Handling
|
|
185
|
+
|
|
186
|
+
| Error Message | Cause |
|
|
187
|
+
|----------------|--------|
|
|
188
|
+
| `❌ action undefined.` | No command provided |
|
|
189
|
+
| `❌ table undefined.` | Table name missing |
|
|
190
|
+
| `❌ ERROR:` | Internal error (e.g. DB connection failure) |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
# regen CLI Tool
|
|
195
|
+
|
|
196
|
+
`regen` is a Node.js-based code generator designed to create pages, forms, routes, services, validation schemas (Zod), dummy data, and TypeScript definitions based on a JSON Schema file. It supports customizable templates and MUI components.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
# Converting Prisma Schema to JSON Schema
|
|
201
|
+
|
|
202
|
+
If you are working with Prisma, you can automatically convert your Prisma schema into a JSON Schema using the following package:
|
|
203
|
+
|
|
204
|
+
🔗 https://www.npmjs.com/package/prisma-json-schema-generator
|
|
205
|
+
|
|
206
|
+
## Steps
|
|
207
|
+
|
|
208
|
+
### 1. Install the generator
|
|
5
209
|
|
|
6
210
|
```bash
|
|
7
|
-
|
|
211
|
+
npm install -D prisma-json-schema-generator
|
|
8
212
|
```
|
|
9
|
-
|
|
213
|
+
|
|
214
|
+
### 2. Add the generator configuration to your `schema.prisma`
|
|
215
|
+
|
|
216
|
+
```prisma
|
|
217
|
+
generator jsonSchema {
|
|
218
|
+
provider = "prisma-json-schema-generator"
|
|
219
|
+
includeRequiredFields = "true"
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
This setup enables Prisma to generate a well-structured JSON Schema based on your models.
|
|
224
|
+
You can then use the generated schema with the `regen` CLI to automate creation of pages, forms, services, validations, and more.
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
## 📦 Installation
|
|
228
|
+
|
|
229
|
+
You can run it directly using `npx`:
|
|
230
|
+
|
|
10
231
|
```bash
|
|
11
|
-
npx
|
|
232
|
+
npx regen <action> [options]
|
|
12
233
|
```
|
|
13
234
|
|
|
14
|
-
|
|
15
|
-
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 🚀 Usage
|
|
238
|
+
|
|
239
|
+
### Basic Command Format
|
|
16
240
|
|
|
17
241
|
```bash
|
|
18
|
-
npx
|
|
242
|
+
npx regen <action> [options]
|
|
19
243
|
```
|
|
20
|
-
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 🛠 Available Actions
|
|
248
|
+
|
|
249
|
+
### **1. `make:page`**
|
|
250
|
+
Generates all pages and services for every definition inside `json-schema.json`.
|
|
251
|
+
|
|
252
|
+
This includes:
|
|
253
|
+
- Service file
|
|
254
|
+
- Validation file
|
|
255
|
+
- Form component
|
|
256
|
+
- Index page
|
|
257
|
+
- Create page
|
|
258
|
+
- Update page
|
|
259
|
+
- View page
|
|
260
|
+
- Dummy data
|
|
261
|
+
- TypeScript definitions
|
|
262
|
+
|
|
21
263
|
```bash
|
|
22
|
-
npx
|
|
264
|
+
npx regen make:page
|
|
23
265
|
```
|
|
24
|
-
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### **2. `make:dummy`**
|
|
270
|
+
Generates only dummy data based on schema.
|
|
271
|
+
|
|
25
272
|
```bash
|
|
26
|
-
npx
|
|
273
|
+
npx regen make:dummy
|
|
27
274
|
```
|
|
28
275
|
|
|
29
|
-
|
|
30
|
-
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### **3. `make:route`**
|
|
279
|
+
Generates route file for all schema definitions.
|
|
31
280
|
|
|
32
281
|
```bash
|
|
33
|
-
npx
|
|
282
|
+
npx regen make:route
|
|
34
283
|
```
|
|
35
|
-
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
### **4. `make:validation`**
|
|
288
|
+
Generates validation files only.
|
|
289
|
+
|
|
36
290
|
```bash
|
|
37
|
-
npx
|
|
291
|
+
npx regen make:validation
|
|
38
292
|
```
|
|
39
|
-
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
### **5. `make:form`**
|
|
297
|
+
Generates form components only.
|
|
298
|
+
|
|
40
299
|
```bash
|
|
41
|
-
npx
|
|
300
|
+
npx regen make:form
|
|
42
301
|
```
|
|
43
302
|
|
|
44
|
-
|
|
45
|
-
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### **6. `--help`**
|
|
306
|
+
Shows help message.
|
|
46
307
|
|
|
47
308
|
```bash
|
|
48
|
-
npx
|
|
309
|
+
npx regen --help
|
|
49
310
|
```
|
|
50
|
-
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## ⚙ Options
|
|
315
|
+
|
|
316
|
+
### `--file=<path>`
|
|
317
|
+
Specify JSON schema file.
|
|
318
|
+
|
|
319
|
+
Default: `./json-schema.json`
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
npx regen make:page --file=./schema/user.json
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
### `--mui`
|
|
328
|
+
Use MUI templates (default).
|
|
329
|
+
|
|
51
330
|
```bash
|
|
52
|
-
npx
|
|
331
|
+
npx regen make:page --mui
|
|
53
332
|
```
|
|
54
333
|
|
|
55
|
-
|
|
56
|
-
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
### Custom Template Options
|
|
337
|
+
|
|
338
|
+
| Option | Description |
|
|
339
|
+
|--------|-------------|
|
|
340
|
+
| `--index-template=<path>` | Custom index page template |
|
|
341
|
+
| `--form-template=<path>` | Custom form template |
|
|
342
|
+
| `--view-template=<path>` | Custom view template |
|
|
343
|
+
| `--create-template=<path>` | Custom create page template |
|
|
344
|
+
| `--update-template=<path>` | Custom update page template |
|
|
345
|
+
| `--template=<dir>` | Directory containing all templates |
|
|
346
|
+
|
|
347
|
+
Example:
|
|
57
348
|
|
|
58
349
|
```bash
|
|
59
|
-
npx
|
|
350
|
+
npx regen make:page --template=./custom-templates
|
|
60
351
|
```
|
|
61
|
-
|
|
352
|
+
|
|
353
|
+
This expects:
|
|
354
|
+
|
|
355
|
+
```
|
|
356
|
+
custom-templates/
|
|
357
|
+
index-template.js
|
|
358
|
+
form-template.js
|
|
359
|
+
view-template.js
|
|
360
|
+
create-template.js
|
|
361
|
+
update-template.js
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
### `--ignore=<templates>`
|
|
367
|
+
|
|
368
|
+
Comma-separated list of templates to skip.
|
|
369
|
+
|
|
370
|
+
Options:
|
|
371
|
+
- create
|
|
372
|
+
- update
|
|
373
|
+
- view
|
|
374
|
+
- form
|
|
375
|
+
- index
|
|
376
|
+
- service
|
|
377
|
+
- validation
|
|
378
|
+
- dummy
|
|
379
|
+
|
|
380
|
+
Example:
|
|
381
|
+
|
|
62
382
|
```bash
|
|
63
|
-
npx
|
|
383
|
+
npx regen make:page --ignore=form,view
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 📂 JSON Schema Requirements
|
|
389
|
+
|
|
390
|
+
Your `json-schema.json` must have:
|
|
391
|
+
|
|
392
|
+
```json
|
|
393
|
+
{
|
|
394
|
+
"definitions": {
|
|
395
|
+
"User": {
|
|
396
|
+
"properties": { ... },
|
|
397
|
+
"required": [ ... ]
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
64
401
|
```
|
|
65
402
|
|
|
403
|
+
Each key inside `definitions` is treated as a module to generate.
|
|
404
|
+
|
|
405
|
+
---
|
|
406
|
+
|
|
407
|
+
## 🛑 Error Handling
|
|
408
|
+
|
|
409
|
+
Errors will be shown as:
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
❌ ERROR: <message>
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## 🧾 License
|
|
418
|
+
|
|
419
|
+
This script is **internal & open for customization**, and can be modified freely for project needs.
|
package/lib/file.gen.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./_virtual/_rollupPluginBabelHelpers.js"),t=require("./mui.gen.js"),a=require("path");require("fs");exports.generateIndexPage=function(r){try{var c=r.title,o=(t.toPascalCase(c),"".concat(t.toKebabCase(c),".service"),t.toPascalCase(c),a.join(process.cwd(),"src","pages",t.toKebabCase(c),"index.page.tsx")),n=(a.dirname(o),Object.entries(r.properties).map((function(a){var r=e.slicedToArray(a,2),c=r[0],o=r[1],n=Array.isArray(o.type)?o.type.at(0):o.type,l=['label: "'.concat(t.toPascalWithSpace(c),'"'),'sortKey: "'.concat(c,'"'),"value: (v) => v.".concat(c)],s=['type: "text"','value: table.query("'.concat(c,'", "")'),'options: { placeholder: "Find '.concat(t.toPascalWithSpace(c),'..." }'),"onChange: (e) => table.setQuery({ ".concat(c,": e.target.value })")],u=[],i={label:c,typeData:n};return t.isString(n)||(t.isNumber(n)?s[3]="onChange: (e) => table.setQuery({ ".concat(c,": +e.target.value })"):t.isBoolean(n)&&(s[0]='type: "select"',s[1]='value: table.query("'.concat(c,'", "00")'),s[3]="onChange: (e) => {table.setQuery({ ".concat(c,': e.target.value === "00" ? "" : e.target.value })}'),s.splice(1,0,'items: [{ primary: "Yes", value: true },{ primary: "No", value: false }]'))),o.format&&["date","date-time"].includes(o.format)&&(s[0]='type: "date"',s=s.filter((function(e,t){return 2!==t}))),o.enum&&(s[0]='type: "select"',s[1]='value: table.query("'.concat(c,'", "00")'),s[3]="onChange: (e) => {table.setQuery({ ".concat(c,': e.target.value === "00" ? "" : e.target.value })}'),s.splice(1,0,"items: [".concat(o.enum.map((function(e){return'{ primary: "'.concat(t.toPascalWithSpace(e),'", value: "').concat(e,'" }')})).join(", "),"]"))),l.push("filter:{".concat(s.join(", "),"}")),u.push(i),u})));console.log("Generate Page:",n)}catch(e){console.log("err::",e)}};
|
package/lib/main.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e,r=require("./_virtual/_rollupPluginBabelHelpers.js"),a=require("./utils.js"),t=require("./make_model.js"),n=require("./make_resource.js"),s=require("./make_controller.js"),c=require("./make_crud.js"),o=require("./make_validation.js"),
|
|
2
|
+
"use strict";var e,r=require("./_virtual/_rollupPluginBabelHelpers.js"),a=require("./utils.js"),t=require("./make_model.js"),n=require("./make_resource.js"),s=require("./make_controller.js"),c=require("./make_crud.js"),o=require("./make_validation.js"),l=require("./make_service.js"),i=require("./db.js"),u=r.toArray(process.argv);u[0],u[1];var p=u[2],m=u.slice(3);p||(console.error("❌ action undefined."),process.exit(1));var f="",v="default",d=null!==(e=process.env.DB_SCHEMA)&&void 0!==e?e:"public",k=process.env.DB_CLIENT||"pg",b=!1;if(m.length>0){var h,x=r.createForOfIteratorHelper(m);try{for(x.s();!(h=x.n()).done;){var y=h.value.split("="),g=r.slicedToArray(y,2),q=g[0],_=g[1];"--schema"===q&&(d=_),"--path"===q&&(v=_),"--prisma"===q&&(b=!0),"--mysql"===q&&(k="mysql"),"--pg"===q&&(k="pg"),"--skip-controller"===q&&(skipController=!0),"--table"===q&&(f=_)}}catch(e){x.e(e)}finally{x.f()}f||(console.error("❌ table undefined."),process.exit(1))}if("--help"===p&&(console.log("\n Usage:npx frgen <action> [options]\n \n Actions:\n make:model Generate model file\n make:resource Generate resource file\n make:controller Generate controller, service, validation, and resource files\n make:crud Generate all files for CRUD operations\n make:validation Generate validation files\n make:service Generate service files\n --help Show this help message\n\n Options:\n --table=<table_name> Specify the table name (required)\n --schema=<schema_name> Specify the database schema (default: public)\n --path=<output_path> Specify the output path (default: default)\n --prisma Generate Prisma-compatible service files\n --mysql Use MySQL as the database client\n --pg Use PostgreSQL as the database client\n "),process.exit(0)),"make:crud"===p){var C=r.toArray(process.argv);C[0],C[1],C[2];var j=C.slice(3);if(j.length>0){var G,S=r.createForOfIteratorHelper(j);try{for(S.s();!(G=S.n()).done;){var A=G.value.split("="),D=r.slicedToArray(A,2),P=D[0],R=D[1];"--schema"===P&&(d=R),"--prisma"===P&&(b=!0),"--pg"===P&&(k="pg"),"--mysql"===P&&(k="mysql",d=process.env.DB_NAME)}}catch(e){S.e(e)}finally{S.f()}}}(function(){var e=r.asyncToGenerator(r.regeneratorRuntime().mark((function e(){var u,m,h,x;return r.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,process.env.DB_CLIENT=k,e.next=4,i.createPool();case 4:return u=e.sent,e.next=7,a.checkDatabaseConnection(u);case 7:e.t0=p,e.next="make:model"===e.t0?10:"make:resource"===e.t0?14:"make:controller"===e.t0?17:"make:crud"===e.t0?26:"make:validation"===e.t0?29:"make:service"===e.t0?32:35;break;case 10:return m="".concat(a.toPascalCase(a.removePluralSuffix(f)),"Controller"),e.next=13,t(m,f,u,d,k);case 13:return e.abrupt("break",37);case 14:return e.next=16,n(f,u,d,k,v);case 16:return e.abrupt("break",37);case 17:return e.next=19,s(f,v);case 19:return e.next=21,l(f,v,b);case 21:return e.next=23,o(f,u,d,k,v);case 23:return e.next=25,n(f,u,d,k,v);case 25:return e.abrupt("break",37);case 26:return e.next=28,c(v,u,d,b,k);case 28:return e.abrupt("break",37);case 29:return e.next=31,o(f,u,d,k,v);case 31:return e.abrupt("break",37);case 32:return e.next=34,l(f,v,b);case 34:return e.abrupt("break",37);case 35:console.error("❌ Unknown action: ".concat(p)),process.exit(1);case 37:e.next=43;break;case 39:e.prev=39,e.t1=e.catch(0),console.error("❌ ERROR:",e.t1),process.exit(1);case 43:if(e.prev=43,null===(h=u)||void 0===h||!h.end){e.next=49;break}return e.next=47,u.end();case 47:e.next=52;break;case 49:if(null===(x=u)||void 0===x||!x.releaseConnection){e.next=52;break}return e.next=52,u.releaseConnection();case 52:return e.finish(43);case 53:case"end":return e.stop()}}),e,null,[[0,39,43,53]])})));return function(){return e.apply(this,arguments)}})()();
|
package/lib/make_controller.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),n=require("fs"),
|
|
2
|
+
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),n=require("fs"),t=require("path"),r=require("./utils.js"),a=function(){var a=e.asyncToGenerator(e.regeneratorRuntime().mark((function a(c,o){var s,i,l,u,d,p,m,x,q,f,v,w,y,R,b,g;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:try{c||(console.error("table name undefined"),process.exit(1)),s=r.removePluralSuffix(c),i="".concat(r.toPascalCase(s),"Resource"),l="".concat(r.toKebabCase(s),".resource"),u="".concat(r.toKebabCase(s),".service"),d="".concat(r.toKebabCase(s),".validation"),p="create".concat(r.toPascalCase(s),"Schema"),m="update".concat(r.toPascalCase(s),"Schema"),x="".concat(r.toPascalCase(s),"Controller"),q=r.toPascalCase(s),f="const validated = await req.validation(".concat(m,");"),v="const validated = await req.validation(".concat(p,");"),w="".concat(r.toKebabCase(s),".controller.ts"),y=r.toKebabCase(s),R=t.join(process.cwd(),"src","app","http","controller",w),"default"!==o&&(R=t.join(process.cwd(),o,w)),b='\nimport { NextFunction, Request, Response } from "express";\nimport { Controller, Get, Post, Put, Delete } from "frexp/lib/Decorator";\nimport { getPaginate, get'.concat(q,"ID, create").concat(q,", update").concat(q,", delete").concat(q,'} from "@service/').concat(u,'";\nimport ').concat(i,' from "@resource/').concat(l,'";\nimport { ').concat(p,",").concat(m,' } from "@validation/').concat(d,'";\n\n@Controller("/').concat(y,'")\nexport class ').concat(x,' {\n\n @Get("/")\n async get').concat(q,"Paginate(req: Request, res: Response, next: NextFunction){\n try {\n const results = await getPaginate(req.query);\n res.json(").concat(i,'.paginate(results));\n } catch (error) {\n next(error);\n }\n };\n\n @Get("/:id")\n async get').concat(q,"View(req: Request, res: Response, next: NextFunction){\n try {\n const model = await get").concat(q,"ID(+req.params.id)\n res.json(new ").concat(i,'(model, true));\n } catch (error) {\n next(error);\n }\n };\n\n @Post("/")\n async create').concat(q,"(req: Request, res: Response, next: NextFunction){\n try {\n ").concat(v,"\n const model = await create").concat(q,"(validated);\n res.json(new ").concat(i,'(model, true));\n } catch (error) {\n next(error);\n }\n };\n\n @Put("/")\n async update').concat(q,"(req: Request, res: Response, next: NextFunction){\n try {\n ").concat(f,"\n const model = await update").concat(q,"(validated);\n res.json(new ").concat(i,'(model, true));\n } catch (error) {\n next(error);\n }\n };\n\n @Delete("/:id")\n async delete$').concat(q,"(req: Request, res: Response, next: NextFunction){\n try {\n await delete").concat(q,"(+req.params.id)\n res.sendStatus(204);\n } catch (error) {\n next(error);\n }\n };\n}\n"),g=t.dirname(R),n.existsSync(g)||n.mkdirSync(g,{recursive:!0}),n.writeFile(R,b,(function(e){e?console.error("err: ",e):console.log("File ".concat(w," has been created"))}))}catch(e){console.error("err::",e)}case 1:case"end":return e.stop()}}),a)})));return function(e,n){return a.apply(this,arguments)}}();module.exports=a;
|
package/lib/make_crud.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),r=require("./make_controller.js"),t=require("./make_model.js"),n=require("./utils.js"),
|
|
2
|
+
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),r=require("./make_controller.js"),t=require("./make_model.js"),a=require("./make_service.js"),n=require("./make_validation.js"),s=require("./utils.js"),u=function(){var u=e.asyncToGenerator(e.regeneratorRuntime().mark((function u(c,o,i,l,p){var v,x,f,m,k,b,_;return e.regeneratorRuntime().wrap((function(u){for(;;)switch(u.prev=u.next){case 0:return u.prev=0,u.next=3,s.getTables(o,i,p);case 3:v=u.sent,x=e.createForOfIteratorHelper(v),u.prev=5,x.s();case 7:if((f=x.n()).done){u.next=24;break}return k=f.value,b=null!==(m=k.table_name)&&void 0!==m?m:k.TABLE_NAME,u.next=12,r(b,c);case 12:return u.next=14,a(b,c,l);case 14:return u.next=16,n(b,pool,i,p,c);case 16:return u.next=18,t(b,pool,i,p,c);case 18:if(l){u.next=22;break}return _=s.toPascalCase(s.removePluralSuffix(b)),u.next=22,t(_,b,o,i,p);case 22:u.next=7;break;case 24:u.next=29;break;case 26:u.prev=26,u.t0=u.catch(5),x.e(u.t0);case 29:return u.prev=29,x.f(),u.finish(29);case 32:u.next=37;break;case 34:u.prev=34,u.t1=u.catch(0),console.log(u.t1);case 37:return u.prev=37,u.finish(37);case 39:case"end":return u.stop()}}),u,null,[[0,34,37,39],[5,26,29,32]])})));return function(e,r,t,a,n){return u.apply(this,arguments)}}();module.exports=u;
|
package/lib/make_resource.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),r=require("fs"),n=require("path"),t=require("./utils.js"),
|
|
2
|
+
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),r=require("fs"),n=require("path"),t=require("./utils.js"),a=function(){var a=e.asyncToGenerator(e.regeneratorRuntime().mark((function a(o,c,u,s,l){var i,p,d,m,f,v,_,b,x;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,o||(console.error("table name undefined"),process.exit(1)),i=t.removePluralSuffix(o),p="".concat(t.toKebabCase(i),".resource.ts"),d="".concat(t.toPascalCase(i),"Resource"),m=n.join(process.cwd(),"src","app","http","resource",p),"default"!==l&&(m=n.join(process.cwd(),l,p)),e.next=9,t.getTableColumns(c,o,u,s);case 9:f=e.sent,v=Object.fromEntries(f.map((function(e){var r,n,t,a,o;return[null!==(r=e.column_name)&&void 0!==r?r:e.COLUMN_NAME,{defaultValue:null!==(n=e.column_default)&&void 0!==n?n:e.COLUMN_DEFAULT,type:null!==(t=e.data_type)&&void 0!==t?t:e.DATA_TYPE,maxLength:null!==(a=e.character_maximum_length)&&void 0!==a?a:e.CHARACTER_MAXIMU_LENGTH,nullable:"YES"===(null!==(o=e.is_nullable)&&void 0!==o?o:e.IS_NULLABLE)}]}))),_=Object.keys(v).filter((function(e){return"created_at"!==e&&"updated_at"!==e})).map((function(e){return"".concat(t.toCamelCase(e),": this.").concat(t.toCamelCase(e))})).join(",\n"),b='\nimport Resource from "frexp/lib/Resource";\n\nexport default class '.concat(d," extends Resource {\n toArray() {\n return {\n").concat(_,"\n };\n }\n}"),x=n.dirname(m),r.existsSync(x)||r.mkdirSync(x,{recursive:!0}),r.writeFile(m,b,(function(e){e?console.error("err:",e):console.log("File ".concat(p," has been created"))})),e.next=21;break;case 18:e.prev=18,e.t0=e.catch(0),console.error("err::",e.t0);case 21:return e.prev=21,e.finish(21);case 23:case"end":return e.stop()}}),a,null,[[0,18,21,23]])})));return function(e,r,n,t,o){return a.apply(this,arguments)}}();module.exports=a;
|
package/lib/make_service.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
2
|
+
"use strict";var n=require("./_virtual/_rollupPluginBabelHelpers.js"),e=require("fs"),t=require("path"),a=require("./utils.js"),o=function(){var o=n.asyncToGenerator(n.regeneratorRuntime().mark((function o(c,r,i){var s,d,u,p,l,m,y,f,w,h,q,x,g,v,b,F,C,P;return n.regeneratorRuntime().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:try{c||(console.error("table name undefined"),process.exit(1)),s=a.removePluralSuffix(c),d=a.toPascalCase(s),u=a.toCamelCase(s),p=a.toPascalCase(s),l="".concat(a.toKebabCase(s),".service.ts"),m=t.join(process.cwd(),"src","app","http","service",l),"default"!==r&&(m=t.join(process.cwd(),r,l)),y="async",f="".concat(d,".query().findById(id)"),w="".concat(d,".query().insertAndFetch(payload)"),h="\n const model = await ".concat(d,'.query().findById(id);\n if (!model) {\n throw new NotFoundException("').concat(d,'");\n }\n await model.$query().updateAndFetch(payload);\n return model;'),q=" \n const model = await ".concat(d,'.query().findById(id);\n if (!model) {\n throw new NotFoundException("').concat(d,'");\n }\n await model.$query().delete();'),x="return ".concat(d,'.query().page(req.getQuery("page", 0), req.getQuery("perPage", 10));'),g="import ".concat(d,' from "@model/').concat(d,'";'),v="Create".concat(a.toPascalCase(s),"Schema"),b="Update".concat(a.toPascalCase(s),"Schema"),F="".concat(a.toKebabCase(s),".validation"),i&&(y="",f="prisma.".concat(u,".findFirst({where : {id}})"),w="prisma.".concat(u,".create({ data: payload })"),h="return prisma.".concat(u,".update({where: {id: +id!}, data: payload})"),q="return prisma.".concat(u,".delete({where: {id}})"),x="\n const count = await prisma.".concat(u,".count();\n const results = await prisma.").concat(u,".findMany({ take: +(qs.take ?? 10), skip: +(qs.skip ?? 0) })\n return { total: count, data: results };\n "),g='import prisma from "@config/db";'),C="\n".concat(g,'\nimport NotFoundException from "@exception/notFound.exception";\nimport {').concat(v,", ").concat(b,'} from "@validation/').concat(F,'";\n\nexport const getPaginate = async (qs: Record<string, any>) => {\n ').concat(x,"\n};\n\nexport const get").concat(p,"ID = async (id:number) => {\n const model = await ").concat(f,';\n if (!model) {\n throw new NotFoundException("Record")\n }\n return model;\n};\n\nexport const create').concat(p," = (payload:").concat(v,") => {\n return ").concat(w,";\n};\n\nexport const update").concat(p," = ").concat(y," ({id, ...payload}:").concat(b,") => {\n ").concat(h,"\n};\n\nexport const delete").concat(p," = ").concat(y," (id:number) => {\n ").concat(q,"\n};\n"),P=t.dirname(m),e.existsSync(P)||e.mkdirSync(P,{recursive:!0}),e.writeFile(m,C,(function(n){n?console.error("err: ",n):console.log("File ".concat(s,".ts has been "))}))}catch(n){console.error("err::",n)}case 1:case"end":return n.stop()}}),o)})));return function(n,e,t){return o.apply(this,arguments)}}();module.exports=o;
|
package/lib/make_validation.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),n=require("fs"),t=require("path"),r=require("./utils.js"),a=["int","integer","bigint","smallint","tinyint","numeric","decimal","float"],c=["varchar","text","string","char","character varying","uuid","date","datetime","timestamp","timestamp with time zone"],o=["boolean"];function i(n,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],l=t.type,s=t.nullable,
|
|
2
|
+
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),n=require("fs"),t=require("path"),r=require("./utils.js"),a=["int","integer","bigint","smallint","tinyint","numeric","decimal","float"],c=["varchar","text","string","char","character varying","uuid","date","datetime","timestamp","timestamp with time zone"],o=["boolean"];function i(n,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],l=t.type,s=t.nullable,d=t.defaultValue,p=["z"],m=a.includes(l),f=c.includes(l),v=o.includes(l),h=u.map((function(e){return e.column_name})).includes(n);if(m)p.push("coerce.number()");else if(f)p.push("string()");else if(v)p.push("boolean()");else if(h){var y=u.find((function(e){return e.column_name===n}));y&&p.push("enum(Object.values(".concat(y.enum_name,") as [string, ...string[]])"))}else p.push("any()");var g=i.includes(n);s&&(p.push("optional()"),p.push("nullish()"));var _=["CURRENT_TIMESTAMP"].includes(d);if(d&&!_&&!g){var b;if(m)b=parseInt(d);else if(h){var A=u.find((function(e){return e.column_name===n}));A&&(b="".concat(A.enum_name,".").concat(r.extractEnumValue(d)))}else b=v?d:"'".concat(d,"'");void 0!==e.typeof(b)&&p.push("default(".concat(b,")"))}return"".concat(r.toCamelCase(n),":").concat(p.join("."))}function u(e,n){var t=n.type,i=["z"],u=a.includes(t),l=c.includes(t),s=o.includes(t);return u?i.push("coerce.number().int().nonoptional()"):l?i.push("string().nonempty().nonoptional()"):s?i.push("boolean()"):i.push("any()"),"".concat(r.toCamelCase(e),":").concat(i.join("."))}function l(e){return!["created_at","updated_at","createdAt","updatedAt"].includes(e)}var s=function(){var a=e.asyncToGenerator(e.regeneratorRuntime().mark((function a(c,o){var s,d,p,m,f,v,h,y,g,_,b,A,C,x,T,j,E,S,P,z,L=arguments;return e.regeneratorRuntime().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return s=L.length>2&&void 0!==L[2]?L[2]:"public",d=L.length>3&&void 0!==L[3]?L[3]:"pg",p=L.length>4&&void 0!==L[4]?L[4]:"default",a.prev=3,c||(console.error("table name undefined"),process.exit(1)),m=r.removePluralSuffix(c),f="".concat(r.toKebabCase(m),".validation.ts"),v="Create".concat(r.toPascalCase(m),"Schema"),h="Update".concat(r.toPascalCase(m),"Schema"),y="create".concat(r.toPascalCase(m),"Schema"),g="update".concat(r.toPascalCase(m),"Schema"),_=t.join(process.cwd(),"src","app","http","validation",f),"default"!==p&&(_=t.join(process.cwd(),p,f)),a.next=15,r.getTableColumns(o,c,s,d);case 15:return b=a.sent,A=Object.fromEntries(b.map((function(e){var n,t,r,a,c;return[null!==(n=e.column_name)&&void 0!==n?n:e.COLUMN_NAME,{defaultValue:null!==(t=e.column_default)&&void 0!==t?t:e.COLUMN_DEFAULT,type:null!==(r=e.data_type)&&void 0!==r?r:e.DATA_TYPE,maxLength:null!==(a=e.character_maximum_length)&&void 0!==a?a:e.CHARACTER_MAXIMU_LENGTH,nullable:"YES"===(null!==(c=e.is_nullable)&&void 0!==c?c:e.IS_NULLABLE)}]}))),a.next=19,r.getPrimaryKeys(o,c,s,d);case 19:return C=a.sent,a.next=22,r.getEnumFieldsAndValues(o,c,s,d);case 22:x=a.sent,T=Object.entries(A).filter((function(n){return l(e.slicedToArray(n,1)[0])})).filter((function(n){var t=e.slicedToArray(n,1)[0];return!C.includes(t)})).map((function(n){var t=e.slicedToArray(n,2),a=t[0],c=t[1];return[r.toCamelCase(a),i(a,c,C,x)]})),j=Object.entries(A).filter((function(n){return l(e.slicedToArray(n,1)[0])})).filter((function(n){var t=e.slicedToArray(n,1)[0];return C.includes(t)})).map((function(n){var t=e.slicedToArray(n,2),a=t[0],c=t[1];return[r.toCamelCase(a),u(a,c)]})),E="",x.length&&(S=x.map((function(e){return e.enum_name})).join(","),E="import { ".concat(S,' } from "@generated/prisma";')),P='\nimport * as z from "zod";\n'.concat(E,"\n\nexport const ").concat(y," = z.object({\n ").concat(T.map((function(n){var t=e.slicedToArray(n,2);return t[0],t[1]})).join(",\n"),"\n});\n\nexport type ").concat(v," = z.infer<typeof ").concat(y,">;\n\nexport const ").concat(g," = ").concat(y,".extend({\n ").concat(j.map((function(n){var t=e.slicedToArray(n,2);return t[0],t[1]})).join(",\n"),"\n});\n\nexport type ").concat(h," = z.infer<typeof ").concat(g,">;\n"),z=t.dirname(_),n.existsSync(z)||n.mkdirSync(z,{recursive:!0}),n.writeFile(_,P,(function(e){e?console.error("err: ",e):console.log("File ".concat(f," has been created"))})),a.next=36;break;case 33:a.prev=33,a.t0=a.catch(3),console.error("err:",a.t0);case 36:return a.prev=36,a.finish(36);case 38:case"end":return a.stop()}}),a,null,[[3,33,36,38]])})));return function(e,n){return a.apply(this,arguments)}}();module.exports=s;
|
package/lib/mui.gen.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var n=require("./_virtual/_rollupPluginBabelHelpers.js"),e=require("fs"),t=require("path"),a=require("json-schema-to-typescript"),o=function(n){return n.replace(/[-_]+(.)?/g,(function(n,e){return e?e.toUpperCase():""})).replace(/^[A-Z]/,(function(n){return n.toLowerCase()}))},r=function(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()},c=function(n){return n.replace(/[_\-\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").map((function(n){return n.charAt(0).toUpperCase()+n.slice(1)})).join("")},i=function(n){return n.replace(/[_\-\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").filter(Boolean).map((function(n){return n.charAt(0).toUpperCase()+n.slice(1)})).join(" ")},s=function(n){return["string"].includes(n)},l=function(n){return["integer","number"].includes(n)},u=function(n){return["boolean"].includes(n)};exports.generateCreatePage=function(n){try{var a=n.title,o="create.page.tsx",s=c(a),l=t.join(process.cwd(),"src","pages",r(a),o),u=t.dirname(l),m='\nimport PageTemplate from "@components/templates/PageTemplate";\nimport Box from "@mui/material/Box";\nimport Form from "./partial/Form";\nimport Toolbar from "@mui/material/Toolbar";\nimport useMutation from "ezhooks/lib/useMutation";\nimport useZod from "@hooks/useZod";\nimport { input'.concat(c(a),'Schema } from "@commons/schema/').concat(r(a),'.schema";\nimport { post').concat(c(a),' } from "@services/').concat(r(a),'.service";\nimport { useNavigate } from "react-router";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport { input').concat(c(a),' } from "@commons/dummy";\n\nconst ').concat(s,"CreatePage = () => {\n const navigate = useNavigate();\n const { setSnackbar } = useSnackbar();\n\n const mutation = useMutation({\n defaultValue: input").concat(c(a),",\n });\n\n const validation = useZod({\n data: mutation.data(),\n schema: input").concat(c(a),"Schema,\n });\n\n const onSubmit = () => {\n const validated = validation.validated();\n if (validated) {\n mutation.send({\n service: post").concat(c(a),',\n onSuccess: () => {\n setSnackbar("Data has been successfully added.");\n mutation.forceReset();\n const timer = setTimeout(() => {\n navigate("/').concat(r(a),'");\n clearTimeout(timer);\n }, 2000);\n },\n });\n }\n };\n\n return (\n <PageTemplate title="Create ').concat(i(a),'" onBack={() => navigate(-1)}>\n <Box\n sx={{\n overflow: "hidden auto",\n minHeight: "100%",\n position: "relative",\n }}\n >\n <Form mutation={mutation} validation={validation} onSubmit={onSubmit} />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default ').concat(s,"CreatePage;\n ");e.existsSync(u)||e.mkdirSync(u,{recursive:!0}),e.writeFile(l,m,(function(n){n?console.error("err: ",n):console.log("file ".concat(a," ").concat(o," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateDummy=function(a){try{var o=a.title,i="".concat(r(o),".schema"),m=t.join(process.cwd(),"src","commons","dummy.ts"),p="Input".concat(c(o),"Schema"),d="import {".concat(p,"} from '@commons/schema/").concat(i,"';"),g=Object.entries(a.properties).filter((function(e){return"id"!==n.slicedToArray(e,1)[0]})).map((function(e){var t=n.slicedToArray(e,2),a=t[0],o=t[1],r="''",c=Array.isArray(o.type)?o.type:[o.type];return c.forEach((function(n,e){var t;0==e&&(r=void 0!==o.default?null!==(t=o.default)&&void 0!==t?t:"":c.includes("null")?null:o.enum?"'".concat(o.enum[0],"'"):s(n)?"''":l(n)?0:!!u(n)||"''")})),"".concat(a,":").concat(r)})),v="\n \nexport const input".concat(c(o),":").concat(p," = {\n").concat(g.join(",\n"),"\n};\n"),f=e.readFileSync(m,"utf8");f.includes(d)||(f=d+"\n"+f),f.includes(v)||(f+="\n"+v),e.writeFileSync(m,f)}catch(n){console.log("err::",n)}},exports.generateForm=function(a){try{var o=a.title,m="".concat(r(o),".schema"),p="Form.tsx",d=t.join(process.cwd(),"src","pages",r(o),"partial",p),g=t.dirname(d),v="Input".concat(c(o),"Schema"),f="import {".concat(v,"} from '@commons/schema/").concat(m,"';"),h=Object.entries(a.properties).filter((function(e){return"id"!==n.slicedToArray(e,1)[0]})).map((function(e){var t=n.slicedToArray(e,2),o=t[0],r=t[1],c=[];return(Array.isArray(r.type)?r.type:[r.type]).forEach((function(n,e){var t;if(0==e)if(r.format&&["date-time","date"].includes(r.format))c=' \n <TextField\n label="'.concat(i(o),'"\n name="').concat(o,'"\n type="date"\n variant="standard"\n placeholder="Please ').concat(i(o).toLowerCase(),'"\n required={').concat((null!==(t=a.required)&&void 0!==t?t:[]).includes(o),'}\n value={mutation.value("').concat(o,'", "")}\n onChange={(e) => mutation.setData({ ').concat(o,': e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(o,'")}\n helperText={validation.message("').concat(o,'")}\n />');else if(r.enum)c='\n <InputSelect\n label="'.concat(i(o),'"\n items={[').concat(r.enum.map((function(n){return'{ primary: "'.concat(i(n),'", value: "').concat(n,'" }')})).join(", "),']}\n variant="standard"\n name="item"\n required\n selectText="Choose one"\n value={mutation.value("').concat(o,'", "00")}\n onChange={(e) => mutation.setData({ ').concat(o,': e.target.value === "00" ? "" : e.target.value })}\n slotProps={{\n inputLabel: { shrink: true },\n select: { native: true },\n }}\n disabled={mutation.processing}\n />\n ');else if(s(n)){var m;c=' \n <TextField\n label="'.concat(i(o),'"\n name="').concat(o,'"\n variant="standard"\n placeholder="Please ').concat(i(o).toLowerCase(),'"\n required={').concat((null!==(m=a.required)&&void 0!==m?m:[]).includes(o),'}\n value={mutation.value("').concat(o,'", "")}\n onChange={(e) => mutation.setData({ ').concat(o,': e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(o,'")}\n helperText={validation.message("').concat(o,'")}\n />')}else if(l(n)){var p;c=' \n <TextField\n label="'.concat(i(o),'"\n name="').concat(o,'"\n type="number"\n variant="standard"\n placeholder="Please ').concat(i(o).toLowerCase(),'"\n required={').concat((null!==(p=a.required)&&void 0!==p?p:[]).includes(o),'}\n value={mutation.value("').concat(o,'", "")}\n onChange={(e) => mutation.setData({ ').concat(o,': +e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(o,'")}\n helperText={validation.message("').concat(o,'")}\n />')}else c=u(n)?'\n <InputSelect\n label="'.concat(i(o),'"\n items={[{ primary: "Yes", value: true },{ primary: "No", value: false }]}\n variant="standard"\n name="item"\n required\n selectText="Choose one"\n value={mutation.value("').concat(o,'", "00")}\n onChange={(e) => mutation.setData({ ').concat(o,': e.target.value === "00" ? "" : e.target.value })}\n slotProps={{\n inputLabel: { shrink: true },\n select: { native: true },\n }}\n disabled={mutation.processing}\n />\n '):"''"})),c})),b='\nimport Stack from "@mui/material/Stack";\nimport LoadComponent from "@components/base/LoadComponent/LoadComponent";\nimport Divider from "@mui/material/Divider";\nimport Typography from "@mui/material/Typography";\nimport Button from "@mui/material/Button";\nimport InputSelect from "@components/base/Input/InputSelect";\nimport { UseZod } from "@hooks/useZod";\nimport { UseMutation } from "ezhooks/lib/useMutation";\n'.concat(f,'\n\nconst TextField = LoadComponent(() => import("@mui/material/TextField"));\n\ntype Props = {\n mutation: UseMutation<').concat(v,">;\n validation: UseZod<").concat(v,'>;\n onSubmit: () => void;\n};\nconst Form = ({ mutation, validation, onSubmit }: Props) => {\n return (\n <Stack\n direction={"column"}\n spacing={2.5}\n sx={{ margin: "0px auto", width: "50%", p: 3 }}\n >\n <Stack spacing={1}>\n <Typography component={"div"} variant="h6">\n Form ').concat(i(o),"\n </Typography>\n\n <Divider />\n </Stack>\n\n ").concat(h.join(" \n"),'\n\n <Stack direction={"row"}>\n <div>\n <Button\n loading={mutation.processing}\n disabled={mutation.processing}\n size="small"\n onClick={onSubmit}\n >\n Save\n </Button>\n </div>\n </Stack>\n </Stack>\n );\n};\n\nexport default Form;');e.existsSync(g)||e.mkdirSync(g,{recursive:!0}),e.writeFile(d,b,(function(n){n?console.error("err: ",n):console.log("file ".concat(o," ").concat(p," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateIndexPage=function(a){try{var o=a.title,m="index.page.tsx",p=c(o),d="".concat(r(o),".service"),g=c(o),v=t.join(process.cwd(),"src","pages",r(o),m),f=t.dirname(v),h=Object.entries(a.properties).map((function(e){var t=n.slicedToArray(e,2),a=t[0],o=t[1],r=Array.isArray(o.type)?o.type.at(0):o.type,c=['label: "'.concat(i(a),'"'),'sortKey: "'.concat(a,'"'),"value: (v) => v.".concat(a)],m=['type: "text"','value: table.query("'.concat(a,'", "")'),'options: { placeholder: "Find '.concat(i(a),'..." }'),"onChange: (e) => table.setQuery({ ".concat(a,": e.target.value })")];return s(r)||(l(r)?m[3]="onChange: (e) => table.setQuery({ ".concat(a,": +e.target.value })"):u(r)&&(m[0]='type: "select"',m[1]='value: table.query("'.concat(a,'", "00")'),m[3]="onChange: (e) => {table.setQuery({ ".concat(a,': e.target.value === "00" ? "" : e.target.value })}'),m.splice(1,0,'items: [{ primary: "Yes", value: true },{ primary: "No", value: false }]'))),o.format&&["date","date-time"].includes(o.format)&&(m[0]='type: "date"',m=m.filter((function(n,e){return 2!==e}))),o.enum&&(m[0]='type: "select"',m[1]='value: table.query("'.concat(a,'", "00")'),m[3]="onChange: (e) => {table.setQuery({ ".concat(a,': e.target.value === "00" ? "" : e.target.value })}'),m.splice(1,0,"items: [".concat(o.enum.map((function(n){return'{ primary: "'.concat(i(n),'", value: "').concat(n,'" }')})).join(", "),"]"))),c.push("filter:{".concat(m.join(", "),"}")),"{\n ".concat(c.join(", "),"\n }")})),b='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport DataTablePage from "@components/base/DataTable/DataTablePage";\nimport Dropdown from "@components/base/Dropdown/Dropdown";\nimport useTable from "ezhooks/lib/useTable";\nimport { get'.concat(g,", delete").concat(g,' } from "@services/').concat(d,'";\n\nimport { getPagination } from "@utils/table";\nimport { useNavigate } from "react-router";\nimport { useAlert } from "@contexts/AlertContext";\nimport { useSnackbar } from "@contexts/SnackbarContext";\n\nconst ').concat(p,"Page = () => {\n const navigate = useNavigate();\n const alert = useAlert();\n const { setSnackbar } = useSnackbar();\n\n const table = useTable({\n service: get").concat(g,',\n selector: (resp) => resp.data,\n total: (resp) => resp.total,\n replaceUrl: true,\n pagination: {\n startPage: 0,\n },\n });\n\n const onClickEdit = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n navigate(`/edit/${value}`);\n };\n\n const onClickView = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n navigate(`/view/${value}`);\n };\n\n const onClickDelete = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n alert.set({\n open: true,\n title: "Delete Confirmation",\n message:\n "Are you sure you want to delete this item? This action cannot be undone.",\n type: "warning",\n confirm: {\n onClick: () => {\n alert.set({ loading: true });\n delete').concat(g,'({ params: { id: value } })\n .then(() => {\n setSnackbar("Data has been successfully deleted.");\n alert.reset();\n table.reload();\n })\n .catch((e) => {\n setSnackbar(e?.message, { severity: "error" });\n })\n .finally(() => {\n alert.set({ loading: false });\n });\n },\n },\n });\n };\n\n return (\n <PageTemplate title="').concat(p,' Page" onReload={table.reload}>\n <DataTablePage\n tableProps={{ size: "small" }}\n loading={table.loading}\n onOrder={table.onSort}\n order={table.order}\n orderBy={table.orderBy}\n column={[\n ').concat(h.join(", "),',\n {\n label: "",\n value: (v) => (\n <Dropdown\n menu={[\n { text: "View", value: v.id, onClick: onClickView },\n { text: "Edit", value: v.id, onClick: onClickEdit },\n { text: "Delete", value: v.id, onClick: onClickDelete },\n ]}\n />\n ),\n head: {\n padding: "checkbox",\n },\n },\n ]}\n data={table.data}\n pagination={getPagination(table.pagination)}\n />\n </PageTemplate>\n );\n};\n\nexport default ').concat(p,"Page;");e.existsSync(f)||e.mkdirSync(f,{recursive:!0}),e.writeFile(v,b,(function(n){n?console.error("err: ",n):console.log("file ".concat(o," ").concat(m," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateRoute=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];try{var a="router.tsx",o=[{page:"Page",filename:"index.page",url:""},{page:"ViewPage",filename:"view.page",url:"/view/:id"},{page:"CreatePage",filename:"create.page",url:"/create"},{page:"Update",filename:"update.page",url:"/update/:id"}],i=[],s=[],l=t.join(process.cwd(),"src",a),u=t.dirname(l);n.forEach((function(n){o.forEach((function(e){i.push("const ".concat(c(n)).concat(e.page,' = LoadComponent(() => import("@pages/').concat(r(n),"/").concat(e.filename,'"));')),s.push('{ path: "'.concat(r(n)).concat(e.url,'", element: <').concat(c(n)).concat(e.page," /> }"))}))}));var m='\nimport { createBrowserRouter } from "react-router";\nimport { loader } from "@services/auth.service";\nimport LoadComponent from "@components/base/LoadComponent/LoadComponent";\n\nconst AppLayouts = LoadComponent(() => import("@components/layouts/AppLayout"));\nconst GuestLayout = LoadComponent(\n () => import("@components/layouts/GuestLayout")\n);\n\nconst NotFoundPage = LoadComponent(() => import("@pages/error/PageNotFound"));\nconst SignInPage = LoadComponent(() => import("@pages/auth/LoginPage"));\nconst RegisterPage = LoadComponent(() => import("@pages/auth/RegisterPage"));\nconst VerificationPage = LoadComponent(\n () => import("@pages/auth/VerificationPage")\n);\n\n'.concat(i.join(" \n"),'\n\nconst router = createBrowserRouter(\n [\n {\n path: "/login",\n element: <SignInPage />,\n },\n {\n element: <GuestLayout />,\n children: [\n { path: "/register", element: <RegisterPage /> },\n { path: "/verification", element: <VerificationPage /> },\n ],\n },\n {\n id: "root",\n path: "/",\n loader,\n element: <AppLayouts />,\n hydrateFallbackElement: <span>loading...</span>,\n children: [\n ').concat(s.join(", \n"),'\n ],\n },\n {\n path: "*",\n element: <NotFoundPage />,\n },\n ],\n {\n future: {\n v7_relativeSplatPath: true,\n v7_partialHydration: true,\n v7_skipActionErrorRevalidation: true,\n v7_fetcherPersist: true,\n v7_startTransition: true,\n },\n }\n);\n\nexport default router;\n\n ');e.existsSync(u)||e.mkdirSync(u,{recursive:!0}),e.writeFile(l,m,(function(n){n?console.error("err: ",n):console.log("file ".concat(a," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateService=function(n){try{var a=n.title,i="".concat(r(a),".service.ts"),s=o(a),l=r(a),u=c(a),m=t.join(process.cwd(),"src","services",i),p=t.dirname(m),d="\nimport { ".concat(u,' } from "@typings/model";\nimport { EventSend } from "ezhooks";\nimport * as utils from "ezhooks/lib/utils";\n\nconst baseUrl = import.meta.env.VITE_APP_BASE_API_URL;\n\nexport const ').concat(s,"Url = {\n index: `${baseUrl}/").concat(l,"`,\n view: `${baseUrl}/").concat(l,"/:id`,\n remove: `${baseUrl}/").concat(l,"/:id`,\n};\n\nexport const get").concat(u," = async (event: EventSend): Promise<HttpResponse<").concat(u,"[]>> => {\n let url = ").concat(s,"Url.index;\n const params = new URLSearchParams(event.params);\n if (params.size > 0) {\n url += ").concat("`?${params.toString()}`",";\n }\n \n const resp = await fetch(url, {\n signal: event.ctr?.signal,\n });\n \n return resp.json();\n};\n\nexport const get").concat(u,"ID = (id: number) => async (event: EventSend): Promise<HttpResponse<").concat(u,">> => {\n const res = await fetch(utils.route(").concat(s,"Url.view, { id }), {\n signal: event.ctr?.signal,\n });\n return res.json();\n };\n\nexport const post").concat(u," = async (event: EventSend): Promise<HttpResponse<any>> => {\n const res = await fetch(").concat(s,'Url.index, {\n method: "post",\n signal: event.ctr?.signal,\n headers: {\n "content-type": "application/json",\n },\n body: JSON.stringify(event.data()),\n });\n return res.json();\n};\n\nexport const put').concat(u," = async (event: EventSend): Promise<HttpResponse<any>> => {\n const res = await fetch(").concat(s,'Url.index, {\n method: "put",\n signal: event.ctr?.signal,\n headers: {\n "content-type": "application/json",\n },\n body: JSON.stringify(event.data()),\n });\n return res.json();\n};\n\nexport const delete').concat(u," = async (event: EventSend) => {\n return fetch(utils.route(").concat(s,'Url.remove, { id: event.params.id }), {\n method: "delete",\n signal: event.ctr?.signal,\n });\n};\n ');e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),e.writeFile(m,d,(function(n){n?console.error("err: ",n):console.log("file ".concat(i," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateUpdatePage=function(n){try{var a=n.title,o="update.page.tsx",s=c(a),l=t.join(process.cwd(),"src","pages",r(a),o),u=t.dirname(l),m='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport Box from "@mui/material/Box";\nimport Form from "./partial/Form";\nimport Toolbar from "@mui/material/Toolbar";\nimport useMutation from "ezhooks/lib/useMutation";\nimport useZod from "@hooks/useZod";\nimport { input'.concat(c(a),'Schema } from "@commons/schema/').concat(r(a),'.schema";\nimport { put').concat(c(a),", get").concat(c(a),'ID } from "@services/').concat(r(a),'.service";\nimport { useNavigate, useParams } from "react-router";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport { input').concat(c(a),' } from "@commons/dummy";\n\nconst ').concat(s,"UpdatePage = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const { setSnackbar } = useSnackbar();\n\n const mutation = useMutation({\n defaultValue: input").concat(c(a),",\n });\n\n const validation = useZod({\n data: mutation.data(),\n schema: (z) => input").concat(c(a),"Schema(z).extend({ id: z.number() }),\n });\n\n const onSubmit = () => {\n const validated = validation.validated();\n if (validated) {\n mutation.send({\n service: put").concat(c(a),',\n onSuccess: () => {\n setSnackbar("Your changes have been saved successfully.");\n mutation.forceReset();\n const timer = setTimeout(() => {\n navigate("/').concat(r(a),'");\n clearTimeout(timer);\n }, 2000);\n },\n });\n }\n };\n\n const fetchData = () => {\n mutation.send({\n service: get').concat(c(a),'ID(+id),\n onSuccess: (resp) => {\n mutation.setData(resp.data);\n },\n });\n };\n\n React.useEffect(() => {\n if (!id) return;\n fetchData();\n return () => {\n mutation.cancel();\n };\n }, [id]);\n\n return (\n <PageTemplate title="Update ').concat(i(a),'" onBack={() => navigate(-1)}>\n <Box\n sx={{\n overflow: "hidden auto",\n minHeight: "100%",\n position: "relative",\n }}\n >\n <Form mutation={mutation} validation={validation} onSubmit={onSubmit} />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default ').concat(s,"UpdatePage;\n ");e.existsSync(u)||e.mkdirSync(u,{recursive:!0}),e.writeFile(l,m,(function(n){n?console.error("err: ",n):console.log("file ".concat(a," ").concat(o," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateValidation=function(a){try{var o=a.title,i="".concat(r(o),".schema.ts"),m=t.join(process.cwd(),"src","commons","schema",i),p=t.dirname(m),d=Object.entries(a.properties).filter((function(e){return"id"!==n.slicedToArray(e,1)[0]})).map((function(e){var t=n.slicedToArray(e,2),o=t[0],r=t[1],c=["zod"];return(Array.isArray(r.type)?r.type:[r.type]).forEach((function(n,e){0==e&&(r.enum?c.push("enum([".concat(r.enum.map((function(n){return"'".concat(n,"'")})).join(", "),"])")):s(n)?c.push("string()"):l(n)?c.push("number()"):u(n)?c.push("boolean()"):c.push("any()"),a.required&&a.required.includes(o)&&s(n)&&c.push("nonempty()")),"null"===n&&(c.push("optional()"),c.push("nullish()"))})),void 0!==r.default&&(s(r.default)?c.push("default('".concat(r.default,"')")):c.push("default(".concat(r.default,")"))),"".concat(o,":").concat(c.join("."))})),g="input".concat(c(o),"Schema"),v='\nimport * as z from "zod";\n \nexport const '.concat(g," = (zod:typeof z) => zod.object({\n ").concat(d.map((function(n){return n})).join(",\n"),"\n});\n\nexport type ").concat(c(g)," = z.infer<ReturnType<typeof ").concat(g,">>;\n\n");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),e.writeFile(m,v,(function(n){n?console.error("err: ",n):console.log("file ".concat(o," ").concat(i," has been created"))}))}catch(n){console.log("err::",n)}},exports.generateViewPage=function(a){try{var o=a.title,s="view.page.tsx",l=c(o),u="".concat(r(o),".service"),m=c(o),p=t.join(process.cwd(),"src","pages",r(o),s),d=t.dirname(p),g=Object.entries(a.properties).map((function(e){var t=n.slicedToArray(e,1)[0],a=['label: "'.concat(i(t),'"'),"value: (v) => v.".concat(t)];return"{\n ".concat(a.join(", "),"\n }")})),v='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport TableView from "@components/base/Table/TableView";\nimport Box from "@mui/material/Box";\nimport Toolbar from "@mui/material/Toolbar"\n\nimport { get'.concat(m,"ID, delete").concat(m,' } from "@services/').concat(u,'";\nimport { useNavigate, useParams } from "react-router";\nimport { useAlert } from "@contexts/AlertContext";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport useRequest from "ezhooks/lib/useRequest";\n\nconst ').concat(l,'ViewPage = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const alert = useAlert();\n const { setSnackbar } = useSnackbar();\n\n const client = useRequest({ data: {} });\n\n const onClickEdit = () => {\n navigate(`/edit/${id}`);\n };\n\n const onClickDelete = () => {\n alert.set({\n open: true,\n title: "Delete Confirmation",\n message:\n "Are you sure you want to delete this item? This action cannot be undone.",\n type: "warning",\n confirm: {\n onClick: () => {\n alert.set({ loading: true });\n delete').concat(m,'({ params: { id: +id } })\n .then(() => {\n setSnackbar("Data has been successfully deleted.");\n alert.reset();\n const timer = setTimeout(() => {\n navigate("/example");\n clearTimeout(timer);\n }, 1500);\n })\n .catch((e) => {\n setSnackbar(e?.message, { severity: "error" });\n })\n .finally(() => {\n alert.set({ loading: false });\n });\n },\n },\n });\n };\n\n const fetchData = () => {\n client.exec({\n service: get').concat(m,'ID(+id),\n onSuccess: (data) => {\n return data.data;\n },\n });\n };\n\n React.useEffect(() => {\n if (!id) return;\n fetchData();\n\n return () => {\n client.cancel();\n };\n }, [id]);\n\n return (\n <PageTemplate \n title="View ').concat(l,'" \n onBack={() => navigate(-1)}\n onUpdate={onClickEdit}\n onDelete={onClickDelete}\n onReload={fetchData}\n >\n <Box sx={{ overflow: "hidden auto", minHeight: "100%" }}>\n <TableView\n loading={client.loading}\n data={client.data}\n column={[').concat(g.join(", "),"]}\n />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default ").concat(l,"ViewPage;");e.existsSync(d)||e.mkdirSync(d,{recursive:!0}),e.writeFile(p,v,(function(n){n?console.error("err: ",n):console.log("file ".concat(o," ").concat(s," has been created"))}))}catch(n){console.log("err::",n)}},exports.jsonToTS=function(n){a.compileFromFile(n,{inferStringEnumKeysFromValues:!0,bannerComment:"/* eslint-disable */\n/**\n* This file was automatically generated by json-schema-to-typescript.\n*.\n*/"}).then((function(n){var a=t.join(process.cwd(),"src","typings","model","index.d.ts"),o=t.dirname(a);e.existsSync(o)||e.mkdirSync(o,{recursive:!0}),e.writeFileSync(t.join(process.cwd(),"src","typings","model","index.d.ts"),n)})).catch(console.log)},exports.toCamelCase=o,exports.toKebabCase=r,exports.toPascalCase=c,exports.toPascalWithSpace=i;
|
|
2
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./_virtual/_rollupPluginBabelHelpers.js"),n=require("fs"),t=require("path"),a=require("json-schema-to-typescript"),o=function(e){return e.replace(/[-_]+(.)?/g,(function(e,n){return n?n.toUpperCase():""})).replace(/^[A-Z]/,(function(e){return e.toLowerCase()}))},r=function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()},c=function(e){return e.replace(/[_\-\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").map((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})).join("")},i=function(e){return e.replace(/[_\-\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").filter(Boolean).map((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})).join(" ")},s=function(e){return["string"].includes(e)},l=function(e){return["integer","number"].includes(e)},u=function(e){return["boolean"].includes(e)};exports.generateCreatePage=function(e,a){try{var o=e.title,s="create.page.tsx",l=(c(o),t.join(process.cwd(),"src","pages",r(o),s)),u=t.dirname(l),m='\nimport PageTemplate from "@components/templates/PageTemplate";\nimport Box from "@mui/material/Box";\nimport Form from "./partial/Form";\nimport Toolbar from "@mui/material/Toolbar";\nimport useMutation from "ezhooks/lib/useMutation";\nimport useZod from "@hooks/useZod";\nimport { input'.concat(c(o),'Schema } from "@schemas/').concat(r(o),'.schema";\nimport { post').concat(c(o),' } from "@services/').concat(r(o),'.service";\nimport { useNavigate } from "react-router";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport { input').concat(c(o),' } from "@commons/dummy";\n\nconst Page = () => {\n const navigate = useNavigate();\n const { setSnackbar } = useSnackbar();\n\n const mutation = useMutation({\n defaultValue: input').concat(c(o),",\n });\n\n const validation = useZod({\n data: mutation.data,\n schema: input").concat(c(o),"Schema,\n });\n\n const onSubmit = () => {\n const validated = validation.validated();\n if (validated) {\n mutation.send({\n service: post").concat(c(o),',\n onSuccess: () => {\n setSnackbar("Data has been successfully added.");\n mutation.reset();\n const timer = setTimeout(() => {\n navigate("/').concat(r(o),'");\n clearTimeout(timer);\n }, 2000);\n },\n });\n }\n };\n\n return (\n <PageTemplate title="Create ').concat(i(o),'" onBack={() => navigate(-1)}>\n <Box\n sx={{\n overflow: "hidden auto",\n minHeight: "100%",\n position: "relative",\n }}\n >\n <Form mutation={mutation} validation={validation} onSubmit={onSubmit} />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default Page;\n ');if(a){var p=t.join(process.cwd(),a);if(n.existsSync(p)){var d=n.readFileSync(p,"utf-8");m=new Function("".concat(d," return createTemplate;"))()({modelName:o,properties:e})}}n.existsSync(u)||n.mkdirSync(u,{recursive:!0}),n.writeFile(l,m,(function(e){e?console.error("err: ",e):console.log("file ".concat(o," ").concat(s," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateDummy=function(a){try{var o=a.title,i="".concat(r(o),".schema"),m=t.join(process.cwd(),"src","commons","dummy.ts"),p="Input".concat(c(o),"Schema"),d="import {".concat(p,"} from '@schemas/").concat(i,"';"),v=Object.entries(a.properties).filter((function(n){return"id"!==e.slicedToArray(n,1)[0]})).map((function(n){var t=e.slicedToArray(n,2),a=t[0],o=t[1],r="''",c=Array.isArray(o.type)?o.type:[o.type];return c.forEach((function(e,n){var t;0==n&&(r=void 0!==o.default?null!==(t=o.default)&&void 0!==t?t:"":c.includes("null")?null:o.enum?"'".concat(o.enum[0],"'"):s(e)?"''":l(e)?0:!!u(e)||"''")})),"".concat(a,":").concat(r)})),g="\n \nexport const input".concat(c(o),":").concat(p," = {\n").concat(v.join(",\n"),"\n};\n"),f=n.readFileSync(m,"utf8");f.includes(d)||(f=d+"\n"+f),f.includes(g)||(f+="\n"+g),n.writeFileSync(m,f)}catch(e){console.log("err::",e)}},exports.generateForm=function(a){var o=arguments.length>2?arguments[2]:void 0;try{var m=a.title,p="".concat(r(m),".schema"),d="Form.tsx",v=t.join(process.cwd(),"src","pages",r(m),"partial",d),g=t.dirname(v),f="Input".concat(c(m),"Schema"),h="import {".concat(f,"} from '@schemas/").concat(p,"';"),y=[],b=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(o>1)return[];for(var r=[],c=0,m=Object.entries(n);c<m.length;c++){var p=e.slicedToArray(m[c],2),d=p[0],v=p[1];if("id"!==d){d=t?"".concat(t,".").concat(d):d;var g,f="",h=Array.isArray(v.type)?v.type:[v.type],y=e.createForOfIteratorHelper(h);try{for(y.s();!(g=y.n()).done;){var b,x=g.value;if(v.format&&["date-time","date"].includes(v.format))f=' \n <TextField\n label="'.concat(i(d),'"\n name="').concat(d,'"\n type="date"\n variant="standard"\n placeholder="Please ').concat(i(d).toLowerCase(),'"\n required={').concat((null!==(b=a.required)&&void 0!==b?b:[]).includes(d),'}\n value={mutation.value("').concat(d,'", "")}\n onChange={(e) => mutation.setData({').concat(o>0?"['".concat(d,"']"):d,': e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(d,'")}\n helperText={validation.message("').concat(d,'")}\n />');else if(v.enum)f='\n <InputSelect\n label="'.concat(i(d),'"\n items={[').concat(v.enum.map((function(e){return'{ primary: "'.concat(i(e),'", value: "').concat(e,'" }')})).join(", "),']}\n variant="standard"\n name="item"\n required\n selectText="Choose one"\n value={mutation.value("').concat(d,'", "00")}\n onChange={(e) => mutation.setData({').concat(o>0?"['".concat(d,"']"):d,': e.target.value === "00" ? "" : e.target.value })}\n slotProps={{\n inputLabel: { shrink: true },\n select: { native: true },\n }}\n disabled={mutation.processing}\n />');else if(s(x)){var S;f=' \n <TextField\n label="'.concat(i(d),'"\n name="').concat(d,'"\n variant="standard"\n placeholder="Please ').concat(i(d).toLowerCase(),'"\n required={').concat((null!==(S=a.required)&&void 0!==S?S:[]).includes(d),'}\n value={mutation.value("').concat(d,'", "")}\n onChange={(e) => mutation.setData({').concat(o>0?"['".concat(d,"']"):d,': e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(d,'")}\n helperText={validation.message("').concat(d,'")}\n />')}else if(l(x)){var T;f=' \n <TextField\n label="'.concat(i(d),'"\n name="').concat(d,'"\n type="number"\n variant="standard"\n placeholder="Please ').concat(i(d).toLowerCase(),'"\n required={').concat((null!==(T=a.required)&&void 0!==T?T:[]).includes(d),'}\n value={mutation.value("').concat(d,'", "")}\n onChange={(e) => mutation.setData({').concat(o>0?"['".concat(d,"']"):d,': +e.target.value })}\n slotProps={{ inputLabel: { shrink: true } }}\n disabled={mutation.processing}\n error={validation.error("').concat(d,'")}\n helperText={validation.message("').concat(d,'")}\n />')}else f=u(x)?'\n <InputSelect\n label="'.concat(i(d),'"\n items={[{ primary: "Yes", value: true },{ primary: "No", value: false }]}\n variant="standard"\n name="item"\n required\n selectText="Choose one"\n value={mutation.value("').concat(d,'", "00")}\n onChange={(e) => mutation.setData({').concat(o>0?"['".concat(d,"']"):d,': e.target.value === "00" ? "" : e.target.value })}\n slotProps={{\n inputLabel: { shrink: true },\n select: { native: true },\n }}\n disabled={mutation.processing}\n />'):""}}catch(e){y.e(e)}finally{y.f()}r.push(f)}}return r}(a.properties),x='\nimport Stack from "@mui/material/Stack";\nimport LoadComponent from "@components/base/LoadComponent/LoadComponent";\nimport Divider from "@mui/material/Divider";\nimport Typography from "@mui/material/Typography";\nimport Button from "@mui/material/Button";\nimport InputSelect from "@components/base/Input/InputSelect";\nimport { UseZod } from "@hooks/useZod";\nimport { UseMutation } from "ezhooks/lib/useMutation";\n'.concat(y.length?"import {".concat(y.join(", "),"} from '@commons/dummy';"):"","\n").concat(h,'\n\nconst TextField = LoadComponent(() => import("@mui/material/TextField"));\n\ntype Props = {\n mutation: UseMutation<').concat(f,">;\n validation: UseZod<").concat(f,'>;\n onSubmit: () => void;\n};\nconst Form = ({ mutation, validation, onSubmit }: Props) => {\n return (\n <Stack\n direction={"column"}\n spacing={2.5}\n sx={{ margin: "0px auto", width: "50%", p: 3 }}\n >\n <Stack spacing={1}>\n <Typography component={"div"} variant="h6">\n Form ').concat(i(m),"\n </Typography>\n\n <Divider />\n </Stack>\n\n ").concat(b.join(" \n"),'\n\n <Stack direction={"row"}>\n <div>\n <Button\n loading={mutation.processing}\n disabled={mutation.processing}\n size="small"\n onClick={onSubmit}\n >\n Save\n </Button>\n </div>\n </Stack>\n </Stack>\n );\n};\n\nexport default Form;');if(o){var S=t.join(process.cwd(),o);if(n.existsSync(S)){var T=n.readFileSync(S,"utf-8");x=new Function("".concat(T," return formTemplate;"))()({modelName:m,properties:a})}}n.existsSync(g)||n.mkdirSync(g,{recursive:!0}),n.writeFile(v,x,(function(e){e?console.error("err: ",e):console.log("file ".concat(m," ").concat(d," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateIndexPage=function(a,o){try{var m=a.title,p="index.page.tsx",d=c(m),v="".concat(r(m),".service"),g=c(m),f=t.join(process.cwd(),"src","pages",r(m),p),h=t.dirname(f),y=[],b=Object.entries(a.properties).map((function(n){var t=e.slicedToArray(n,2),a=t[0],o=t[1],r=Array.isArray(o.type)?o.type.at(0):o.type,c={key:a,type:r},m=['label: "'.concat(i(a),'"'),'sortKey: "'.concat(a,'"'),"value: (v) => v.".concat(a)],p=['type: "text"','value: table.query("'.concat(a,'", "")'),'options: { placeholder: "Find '.concat(i(a),'..." }'),"onChange: (e) => table.setQuery({ ".concat(a,": e.target.value })")];return s(r)||(l(r)?p[3]="onChange: (e) => table.setQuery({ ".concat(a,": +e.target.value })"):u(r)&&(p[0]='type: "select"',p[1]='value: table.query("'.concat(a,'", "00")'),p[3]="onChange: (e) => {table.setQuery({ ".concat(a,': e.target.value === "00" ? "" : e.target.value })}'),p.splice(1,0,'items: [{ primary: "Yes", value: true },{ primary: "No", value: false }]'))),o.format&&["date","date-time"].includes(o.format)&&(p[0]='type: "date"',p=p.filter((function(e,n){return 2!==n}))),o.enum&&(p[0]='type: "select"',p[1]='value: table.query("'.concat(a,'", "00")'),p[3]="onChange: (e) => {table.setQuery({ ".concat(a,': e.target.value === "00" ? "" : e.target.value })}'),p.splice(1,0,"items: [".concat(o.enum.map((function(e){return'{ primary: "'.concat(i(e),'", value: "').concat(e,'" }')})).join(", "),"]")),c.enum=o.enum),m.push("filter:{".concat(p.join(", "),"}")),y.push(c),"{\n ".concat(m.join(", "),"\n }")})),x='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport DataTablePage from "@components/base/DataTable/DataTablePage";\nimport Dropdown from "@components/base/Dropdown/Dropdown";\nimport useTable from "ezhooks/lib/useTable";\nimport { get'.concat(g,", delete").concat(g,' } from "@services/').concat(v,'";\n\nimport { getPagination } from "@utils/table";\nimport { useNavigate } from "react-router";\nimport { useAlert } from "@contexts/AlertContext";\nimport { useSnackbar } from "@contexts/SnackbarContext";\n\nconst Page = () => {\n const navigate = useNavigate();\n const alert = useAlert();\n const { setSnackbar } = useSnackbar();\n\n const table = useTable({\n service: get').concat(g,',\n selector: (resp) => resp.data,\n total: (resp) => resp.total,\n replaceUrl: true,\n pagination: {\n startPage: 0,\n },\n });\n\n const onClickEdit = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n navigate(`/edit/${value}`);\n };\n\n const onClickView = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n navigate(`/view/${value}`);\n };\n\n const onClickDelete = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n const value = e.currentTarget.value;\n alert.set({\n open: true,\n title: "Delete Confirmation",\n message:\n "Are you sure you want to delete this item? This action cannot be undone.",\n type: "warning",\n confirm: {\n onClick: () => {\n alert.set({ loading: true });\n delete').concat(g,'({ params: { id: value } })\n .then(() => {\n setSnackbar("Data has been successfully deleted.");\n alert.reset();\n table.reload();\n })\n .catch((e) => {\n setSnackbar(e?.message, { severity: "error" });\n })\n .finally(() => {\n alert.set({ loading: false });\n });\n },\n },\n });\n };\n\n return (\n <PageTemplate title="').concat(d,' Page" onReload={table.reload}>\n <DataTablePage\n tableProps={{ size: "small" }}\n loading={table.loading}\n onOrder={table.onSort}\n order={table.order}\n orderBy={table.orderBy}\n column={[\n ').concat(b.join(", "),',\n {\n label: "",\n value: (v) => (\n <Dropdown\n menu={[\n { text: "View", value: v.id, onClick: onClickView },\n { text: "Edit", value: v.id, onClick: onClickEdit },\n { text: "Delete", value: v.id, onClick: onClickDelete },\n ]}\n />\n ),\n head: {\n padding: "checkbox",\n },\n },\n ]}\n data={table.data}\n pagination={getPagination(table.pagination)}\n />\n </PageTemplate>\n );\n};\n\nexport default Page;');if(o){var S=t.join(process.cwd(),o);if(n.existsSync(S)){var T=n.readFileSync(S,"utf-8");x=new Function("".concat(T," return indexTemplate;"))()({modelName:m,columns:y})}}n.existsSync(h)||n.mkdirSync(h,{recursive:!0}),n.writeFile(f,x,(function(e){e?console.error("err: ",e):console.log("file ".concat(m," ").concat(p," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateRoute=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];try{var a="router.tsx",o=[{page:"Page",filename:"index.page",url:""},{page:"ViewPage",filename:"view.page",url:"/view/:id"},{page:"CreatePage",filename:"create.page",url:"/create"},{page:"Update",filename:"update.page",url:"/update/:id"}],i=[],s=[],l=t.join(process.cwd(),"src",a),u=t.dirname(l);e.forEach((function(e){o.forEach((function(n){i.push("const ".concat(c(e)).concat(n.page,' = LoadComponent(() => import("@pages/').concat(r(e),"/").concat(n.filename,'"));')),s.push('{ path: "'.concat(r(e)).concat(n.url,'", element: <').concat(c(e)).concat(n.page," /> }"))}))}));var m='\nimport { createBrowserRouter } from "react-router";\nimport { loader } from "@services/auth.service";\nimport LoadComponent from "@components/base/LoadComponent/LoadComponent";\n\nconst AppLayouts = LoadComponent(() => import("@components/layouts/AppLayout"));\nconst GuestLayout = LoadComponent(\n () => import("@components/layouts/GuestLayout")\n);\n\nconst NotFoundPage = LoadComponent(() => import("@pages/error/PageNotFound"));\nconst SignInPage = LoadComponent(() => import("@pages/auth/LoginPage"));\nconst RegisterPage = LoadComponent(() => import("@pages/auth/RegisterPage"));\nconst VerificationPage = LoadComponent(\n () => import("@pages/auth/VerificationPage")\n);\n\n'.concat(i.join(" \n"),'\n\nconst router = createBrowserRouter(\n [\n {\n path: "/login",\n element: <SignInPage />,\n },\n {\n element: <GuestLayout />,\n children: [\n { path: "/register", element: <RegisterPage /> },\n { path: "/verification", element: <VerificationPage /> },\n ],\n },\n {\n id: "root",\n path: "/",\n loader,\n element: <AppLayouts />,\n hydrateFallbackElement: <span>loading...</span>,\n children: [\n ').concat(s.join(", \n"),'\n ],\n },\n {\n path: "*",\n element: <NotFoundPage />,\n },\n ],\n {\n future: {\n v7_relativeSplatPath: true,\n v7_partialHydration: true,\n v7_skipActionErrorRevalidation: true,\n v7_fetcherPersist: true,\n v7_startTransition: true,\n },\n }\n);\n\nexport default router;\n\n ');n.existsSync(u)||n.mkdirSync(u,{recursive:!0}),n.writeFile(l,m,(function(e){e?console.error("err: ",e):console.log("file ".concat(a," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateService=function(e){try{var a=e.title,i="".concat(r(a),".service.ts"),s=o(a),l=r(a),u=c(a),m=t.join(process.cwd(),"src","services",i),p=t.dirname(m),d="\nimport { ".concat(u,' } from "@typings/model";\nimport { EventSend } from "ezhooks";\nimport * as utils from "ezhooks/lib/utils";\n\nconst baseUrl = import.meta.env.VITE_APP_BASE_API_URL;\n\nexport const ').concat(s,"Url = {\n index: `${baseUrl}/").concat(l,"`,\n view: `${baseUrl}/").concat(l,"/:id`,\n remove: `${baseUrl}/").concat(l,"/:id`,\n};\n\nexport const get").concat(u," = async (event: EventSend): Promise<HttpResponse<").concat(u,"[]>> => {\n let url = ").concat(s,"Url.index;\n const params = new URLSearchParams(event.params);\n if (params.size > 0) {\n url += ").concat("`?${params.toString()}`",";\n }\n \n const resp = await fetch(url, {\n signal: event.ctr?.signal,\n });\n \n return resp.json();\n};\n\nexport const get").concat(u,"ID = (id: number) => async (event: EventSend): Promise<HttpResponse<").concat(u,">> => {\n const res = await fetch(utils.route(").concat(s,"Url.view, { id }), {\n signal: event.ctr?.signal,\n });\n return res.json();\n };\n\nexport const post").concat(u," = async (event: EventSend): Promise<HttpResponse<any>> => {\n const res = await fetch(").concat(s,'Url.index, {\n method: "post",\n signal: event.ctr?.signal,\n headers: {\n "content-type": "application/json",\n },\n body: JSON.stringify(event.data()),\n });\n return res.json();\n};\n\nexport const put').concat(u," = async (event: EventSend): Promise<HttpResponse<any>> => {\n const res = await fetch(").concat(s,'Url.index, {\n method: "put",\n signal: event.ctr?.signal,\n headers: {\n "content-type": "application/json",\n },\n body: JSON.stringify(event.data()),\n });\n return res.json();\n};\n\nexport const delete').concat(u," = async (event: EventSend) => {\n return fetch(utils.route(").concat(s,'Url.remove, { id: event.params.id }), {\n method: "delete",\n signal: event.ctr?.signal,\n });\n};\n ');n.existsSync(p)||n.mkdirSync(p,{recursive:!0}),n.writeFile(m,d,(function(e){e?console.error("err: ",e):console.log("file ".concat(i," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateUpdatePage=function(e,a){try{var o=e.title,s="update.page.tsx",l=(c(o),t.join(process.cwd(),"src","pages",r(o),s)),u=t.dirname(l),m='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport Box from "@mui/material/Box";\nimport Form from "./partial/Form";\nimport Toolbar from "@mui/material/Toolbar";\nimport useMutation from "ezhooks/lib/useMutation";\nimport useZod from "@hooks/useZod";\nimport { input'.concat(c(o),'Schema } from "@schemas/').concat(r(o),'.schema";\nimport { put').concat(c(o),", get").concat(c(o),'ID } from "@services/').concat(r(o),'.service";\nimport { useNavigate, useParams } from "react-router";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport { input').concat(c(o),' } from "@commons/dummy";\n\nconst Page = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const { setSnackbar } = useSnackbar();\n\n const mutation = useMutation({\n defaultValue: input').concat(c(o),",\n });\n\n const validation = useZod({\n data: mutation.data,\n schema: input").concat(c(o),"Schema(z).extend({ id: z.number() }),\n });\n\n const onSubmit = () => {\n const validated = validation.validated();\n if (validated) {\n mutation.send({\n service: put").concat(c(o),',\n onSuccess: () => {\n setSnackbar("Your changes have been saved successfully.");\n mutation.reset();\n const timer = setTimeout(() => {\n navigate("/').concat(r(o),'");\n clearTimeout(timer);\n }, 2000);\n },\n });\n }\n };\n\n const fetchData = () => {\n mutation.send({\n service: get').concat(c(o),'ID(+id),\n onSuccess: (resp) => {\n mutation.setData(resp.data);\n },\n });\n };\n\n React.useEffect(() => {\n if (!id) return;\n fetchData();\n return () => {\n mutation.cancel();\n };\n }, [id]);\n\n return (\n <PageTemplate title="Update ').concat(i(o),'" onBack={() => navigate(-1)}>\n <Box\n sx={{\n overflow: "hidden auto",\n minHeight: "100%",\n position: "relative",\n }}\n >\n <Form mutation={mutation} validation={validation} onSubmit={onSubmit} />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default Page;\n ');if(a){var p=t.join(process.cwd(),a);if(n.existsSync(p)){var d=n.readFileSync(p,"utf-8");m=new Function("".concat(d," return updateTemplate;"))()({modelName:o,properties:e})}}n.existsSync(u)||n.mkdirSync(u,{recursive:!0}),n.writeFile(l,m,(function(e){e?console.error("err: ",e):console.log("file ".concat(o," ").concat(s," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateValidation=function(a){try{var o=a.title,i="".concat(r(o),".schema.ts"),m=[],p=t.join(process.cwd(),"src","schemas",i),d=t.dirname(p),v=Object.entries(a.properties).filter((function(n){return"id"!==e.slicedToArray(n,1)[0]})).map((function(n){var t=e.slicedToArray(n,2),o=t[0],i=t[1],p=["zod"];return(Array.isArray(i.type)?i.type:[i.type]).forEach((function(e,n){if(0==n){if(i.enum)p.push("enum([".concat(i.enum.map((function(e){return"'".concat(e,"'")})).join(", "),"])"));else if(s(e))p.push("string()");else if(l(e))p.push("number()");else if(u(e))p.push("boolean()");else if("array"===e){var t;if(null!==(t=i.items)&&void 0!==t&&t.$ref){var d,v=null===(d=i.items)||void 0===d?void 0:d.$ref.split("/").pop();m.push("import { input".concat(c(v),"Schema } from './").concat(r(v),".schema'")),p.push("array(input".concat(c(v),"Schema)"))}}else p.push("any()");a.required&&a.required.includes(o)&&s(e)&&p.push("nonempty()")}"null"===e&&(p.push("optional()"),p.push("nullish()"))})),void 0!==i.default&&(s(i.default)?p.push("default('".concat(i.default,"')")):p.push("default(".concat(i.default,")"))),"".concat(o,":").concat(p.join("."))})),g="input".concat(c(o),"Schema"),f='\nimport * as zod from "zod";\n'.concat(m.join(";\n"),"\n \nexport const ").concat(g," = zod.object({\n ").concat(v.map((function(e){return e})).join(",\n"),"\n});\n\nexport type ").concat(c(g)," = zod.infer<typeof ").concat(g,">;");n.existsSync(d)||n.mkdirSync(d,{recursive:!0}),n.writeFile(p,f,(function(e){e?console.error("err: ",e):console.log("file ".concat(o," ").concat(i," has been created"))}))}catch(e){console.log("err::",e)}},exports.generateViewPage=function(a,o){try{var s=a.title,l="view.page.tsx",u=c(s),m="".concat(r(s),".service"),p=c(s),d=t.join(process.cwd(),"src","pages",r(s),l),v=t.dirname(d),g=[],f=Object.entries(a.properties).map((function(n){var t=e.slicedToArray(n,2),a=t[0],o=t[1],r=['label: "'.concat(i(a),'"'),"value: (v) => v.".concat(a)],c={key:a,type:Array.isArray(o.type)?o.type.at(0):o.type};return o.enum&&(c.enum=o.enum),g.push(r),"{\n ".concat(r.join(", "),"\n }")})),h='\nimport React from "react";\nimport PageTemplate from "@components/templates/PageTemplate";\nimport TableView from "@components/base/Table/TableView";\nimport Box from "@mui/material/Box";\nimport Toolbar from "@mui/material/Toolbar"\n\nimport { get'.concat(p,"ID, delete").concat(p,' } from "@services/').concat(m,'";\nimport { useNavigate, useParams } from "react-router";\nimport { useAlert } from "@contexts/AlertContext";\nimport { useSnackbar } from "@contexts/SnackbarContext";\nimport useRequest from "ezhooks/lib/useRequest";\n\nconst Page = () => {\n const { id } = useParams();\n const navigate = useNavigate();\n const alert = useAlert();\n const { setSnackbar } = useSnackbar();\n\n const client = useRequest({ data: {} });\n\n const onClickEdit = () => {\n navigate(`/edit/${id}`);\n };\n\n const onClickDelete = () => {\n alert.set({\n open: true,\n title: "Delete Confirmation",\n message:\n "Are you sure you want to delete this item? This action cannot be undone.",\n type: "warning",\n confirm: {\n onClick: () => {\n alert.set({ loading: true });\n delete').concat(p,'({ params: { id: +id } })\n .then(() => {\n setSnackbar("Data has been successfully deleted.");\n alert.reset();\n const timer = setTimeout(() => {\n navigate("/example");\n clearTimeout(timer);\n }, 1500);\n })\n .catch((e) => {\n setSnackbar(e?.message, { severity: "error" });\n })\n .finally(() => {\n alert.set({ loading: false });\n });\n },\n },\n });\n };\n\n const fetchData = () => {\n client.exec({\n service: get').concat(p,'ID(+id),\n onSuccess: (data) => {\n return data.data;\n },\n });\n };\n\n React.useEffect(() => {\n if (!id) return;\n fetchData();\n\n return () => {\n client.cancel();\n };\n }, [id]);\n\n return (\n <PageTemplate \n title="View ').concat(u,'" \n onBack={() => navigate(-1)}\n onUpdate={onClickEdit}\n onDelete={onClickDelete}\n onReload={fetchData}\n >\n <Box sx={{ overflow: "hidden auto", minHeight: "100%" }}>\n <TableView\n loading={client.loading}\n data={client.data}\n column={[').concat(f.join(", "),"]}\n />\n\n <Toolbar />\n <Toolbar />\n </Box>\n </PageTemplate>\n );\n};\n\nexport default Page;");if(o){var y=t.join(process.cwd(),o);if(n.existsSync(y)){var b=n.readFileSync(y,"utf-8");h=new Function("".concat(b," return viewTemplate;"))()({modelName:s,columns:g})}}n.existsSync(v)||n.mkdirSync(v,{recursive:!0}),n.writeFile(d,h,(function(e){e?console.error("err: ",e):console.log("file ".concat(s," ").concat(l," has been created"))}))}catch(e){console.log("err::",e)}},exports.isBoolean=u,exports.isNumber=l,exports.isString=s,exports.jsonToTS=function(e){a.compileFromFile(e,{inferStringEnumKeysFromValues:!0,bannerComment:"/* eslint-disable */\n/**\n* This file was automatically generated by json-schema-to-typescript.\n*.\n*/"}).then((function(e){var a=t.join(process.cwd(),"src","typings","model","index.d.ts"),o=t.dirname(a);n.existsSync(o)||n.mkdirSync(o,{recursive:!0}),n.writeFileSync(t.join(process.cwd(),"src","typings","model","index.d.ts"),e)})).catch(console.log)},exports.toCamelCase=o,exports.toKebabCase=r,exports.toPascalCase=c,exports.toPascalWithSpace=i;
|
package/lib/regen.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),
|
|
2
|
+
"use strict";var e=require("./_virtual/_rollupPluginBabelHelpers.js"),t=require("fs"),a=require("path"),r=require("./mui.gen.js"),n=e.toArray(process.argv);n[0],n[1];var i=n[2],o=n.slice(3);i||(console.error("❌ action undefined."),process.exit(1));var c=a.join(process.cwd(),"json-schema.json"),s=void 0,p=void 0,l=void 0,m=void 0,d=void 0,u=[];if(o.length>0){var f,g=e.createForOfIteratorHelper(o);try{for(g.s();!(f=g.n()).done;){var v=f.value.split("="),b=e.slicedToArray(v,2),j=b[0],h=b[1];"--mui"===j&&"mui","--file"===j&&(c=h),"--index-template"===j&&(s=h),"--form-template"===j&&(p=h),"--view-template"===j&&(l=h),"--create-template"===j&&(m=h),"--update-template"===j&&(d=h),"--template"===j&&(s="".concat(h,"/index-template.js"),p="".concat(h,"/form-template.js"),l="".concat(h,"/view-template.js"),m="".concat(h,"/create-template.js"),d="".concat(h,"/update-template.js")),"--ignore"===j&&(u=h.split(","))}}catch(e){g.e(e)}finally{g.f()}}"--help"===i&&(console.log("\n Usage: npx regen <action> [options]\n \n Actions:\n make:page Generate all pages and services\n make:dummy Generate dummy data\n make:route Generate route file\n make:validation Generate validation files\n make:form Generate form components\n --help Show this help message\n \n Options:\n --file=<path> Specify the path to the JSON schema file (default: ./json-schema.json)\n --mui Use MUI templates\n --index-template=<path> Specify custom index page template\n --form-template=<path> Specify custom form component template\n --view-template=<path> Specify custom view page template\n --create-template=<path> Specify custom create page template\n --update-template=<path> Specify custom update page template\n --template=<dir> Specify a directory containing all templates\n --ignore=<templates> Comma-separated list of templates to ignore (options: create, update, view, form, index, service, validation, dummy)\n "),process.exit(0)),function(){var a=e.asyncToGenerator(e.regeneratorRuntime().mark((function a(){var n,o;return e.regeneratorRuntime().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:a.prev=0,n=t.readFileSync(c,{encoding:"utf-8"}),o=JSON.parse(n),a.t0=i,a.next="make:page"===a.t0?6:"make:dummy"===a.t0?8:"make:route"===a.t0?10:"make:validation"===a.t0?12:"make:form"===a.t0?14:16;break;case 6:return Object.entries(o.definitions).forEach((function(t){var a=e.slicedToArray(t,2),n=a[0],i=a[1];u.includes("service")||r.generateService(e.objectSpread2({title:n},i)),u.includes("validation")||r.generateValidation(e.objectSpread2({title:n},i)),u.includes("form")||r.generateForm(e.objectSpread2({title:n},i),o.definitions,p),u.includes("index")||r.generateIndexPage(e.objectSpread2({title:n},i),s),u.includes("create")||r.generateCreatePage(e.objectSpread2({title:n},i),m),u.includes("update")||r.generateUpdatePage(e.objectSpread2({title:n},i),d),u.includes("view")||r.generateViewPage(e.objectSpread2({title:n},i),l),u.includes("dummy")||r.generateDummy(e.objectSpread2({title:n},i)),r.jsonToTS(c)})),a.abrupt("break",18);case 8:return Object.entries(o.definitions).forEach((function(t){var a=e.slicedToArray(t,2),n=a[0],i=a[1];r.generateDummy(e.objectSpread2({title:n},i))})),a.abrupt("break",18);case 10:return r.generateRoute(Object.entries(o.definitions).map((function(t){return e.slicedToArray(t,1)[0]}))),a.abrupt("break",18);case 12:return Object.entries(o.definitions).forEach((function(t){var a=e.slicedToArray(t,2),n=a[0],i=a[1];r.generateValidation(e.objectSpread2({title:n},i))})),a.abrupt("break",18);case 14:return Object.entries(o.definitions).forEach((function(t){var a=e.slicedToArray(t,2),n=a[0],i=a[1];r.generateForm(e.objectSpread2({title:n},i),o.definitions)})),a.abrupt("break",18);case 16:console.error("❌ Unknown action: ".concat(i)),process.exit(1);case 18:a.next=23;break;case 20:a.prev=20,a.t1=a.catch(0),console.error("❌ ERROR:",a.t1);case 23:return a.prev=23,a.finish(23);case 25:case"end":return a.stop()}}),a,null,[[0,20,23,25]])})));return function(){return a.apply(this,arguments)}}()();
|
package/lib/utils.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./_virtual/_rollupPluginBabelHelpers.js");require("path");var n=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t){return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,t.query("SELECT 1");case 3:console.log("Connection success"),e.next=10;break;case 6:e.prev=6,e.t0=e.catch(0),console.error("Gagal terhubung ke database:",e.t0),process.exit(1);case 10:case"end":return e.stop()}}),n,null,[[0,6]])})));return function(e){return n.apply(this,arguments)}}(),t=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=E.length>2&&void 0!==E[2]?E[2]:"public",o=E.length>3&&void 0!==E[3]?E[3]:"pg",e.prev=2,"pg"===o?(c="\n SELECT *\n FROM information_schema.columns\n WHERE table_catalog = current_database()\n AND table_name = $1\n AND table_schema = $2\n ",s=[a,r]):(c="\n SELECT *\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n ",s=[r,a]),e.next=6,t.query(c,s);case 6:return u=e.sent,i=u.rows,m=void 0===i?[]:i,l=u[0],_=void 0===l?[]:l,e.abrupt("return",m.length?m:_);case 14:throw e.prev=14,e.t0=e.catch(2),console.error("Gagal mengambil informasi tabel:",e.t0),e.t0;case 18:case"end":return e.stop()}}),n,null,[[2,14]])})));return function(e,t){return n.apply(this,arguments)}}(),a=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E,p=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=p.length>2&&void 0!==p[2]?p[2]:"public",o=p.length>3&&void 0!==p[3]?p[3]:"pg",e.prev=2,"pg"===o?(c="\n SELECT a.attname as column_name\n FROM pg_index i\n JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)\n JOIN pg_class c ON c.oid = i.indrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE i.indisprimary = true\n AND c.relname = $1\n AND n.nspname = $2\n ",s=[a,r]):(c="\n SELECT COLUMN_NAME AS column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND CONSTRAINT_NAME = 'PRIMARY'\n ",s=[r,a]),e.next=6,t.query(c,s);case 6:return u=e.sent,i=u.rows,m=void 0===i?[]:i,l=u[0],_=void 0===l?[]:l,E=m.length?m:_,e.abrupt("return",E.map((function(e){return e.column_name})));case 15:throw e.prev=15,e.t0=e.catch(2),console.error("Error fetching primary keys:",e.t0),e.t0;case 19:case"end":return e.stop()}}),n,null,[[2,15]])})));return function(e,t){return n.apply(this,arguments)}}(),r=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E=arguments;return e.regeneratorRuntime().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(r=E.length>2&&void 0!==E[2]?E[2]:"public",o=E.length>3&&void 0!==E[3]?E[3]:"pg",n.prev=2,"mysql"!==o){n.next=13;break}return"\n SELECT COLUMN_NAME, COLUMN_TYPE\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n AND data_type = 'enum'\n ",n.next=7,t.query("\n SELECT COLUMN_NAME, COLUMN_TYPE\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n AND data_type = 'enum'\n ",[r,a]);case 7:return c=n.sent,s=e.slicedToArray(c,1),u=s[0],n.abrupt("return",u.map((function(e){return{column_name:e.COLUMN_NAME,enum_name:e.COLUMN_NAME,values:e.COLUMN_TYPE.replace(/^enum\((.*)\)$/,"$1").split(",").map((function(e){return e.trim().replace(/^'|'$/g,"")}))}})));case 13:return"\n SELECT column_name, udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND data_type = 'USER-DEFINED'\n ",n.next=16,t.query("\n SELECT column_name, udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND data_type = 'USER-DEFINED'\n ",[r,a]);case 16:if(0!==(i=n.sent).rows.length){n.next=19;break}return n.abrupt("return",[]);case 19:return m=i.rows.map((function(e){return e.udt_name})),"\n SELECT t.typname as enum_name, e.enumlabel as value\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON n.oid = t.typnamespace\n WHERE t.typname = ANY($1)\n ORDER BY t.typname, e.enumsortorder\n ",n.next=23,t.query("\n SELECT t.typname as enum_name, e.enumlabel as value\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON n.oid = t.typnamespace\n WHERE t.typname = ANY($1)\n ORDER BY t.typname, e.enumsortorder\n ",[m]);case 23:return l=n.sent,_=l.rows.reduce((function(e,n){return e[n.enum_name]=e[n.enum_name]||[],e[n.enum_name].push(n.value),e}),{}),n.abrupt("return",i.rows.map((function(e){return{column_name:e.column_name,enum_name:e.udt_name,values:_[e.udt_name]||[]}})));case 26:n.next=32;break;case 28:throw n.prev=28,n.t0=n.catch(2),console.error("Error fetching ENUM fields:",n.t0),n.t0;case 32:case"end":return n.stop()}}),n,null,[[2,28]])})));return function(e,t){return n.apply(this,arguments)}}(),o=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E,p,N,f,A,g,h,b,O=arguments;return e.regeneratorRuntime().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(r=O.length>2&&void 0!==O[2]?O[2]:"public",o=O.length>3&&void 0!==O[3]?O[3]:"pg",n.prev=2,"mysql"!==o){n.next=13;break}return"\n SELECT \n TABLE_NAME,\n COLUMN_NAME,\n REFERENCED_TABLE_NAME AS foreign_table_name,\n REFERENCED_COLUMN_NAME AS foreign_column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND REFERENCED_TABLE_NAME IS NOT NULL\n ",n.next=7,t.query("\n SELECT \n TABLE_NAME,\n COLUMN_NAME,\n REFERENCED_TABLE_NAME AS foreign_table_name,\n REFERENCED_COLUMN_NAME AS foreign_column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND REFERENCED_TABLE_NAME IS NOT NULL\n ",[r,a]);case 7:return c=n.sent,s=e.slicedToArray(c,1),u=s[0],n.abrupt("return",u.map((function(e){return{relation:"BelongsToOneRelation",relatedTable:e.foreign_table_name,foreignKey:e.COLUMN_NAME,localKey:e.foreign_column_name}})));case 13:return"\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = $1\n AND tc.table_schema = $2\n ",i="\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND ccu.table_name = $1\n AND tc.table_schema = $2\n ",n.next=17,t.query("\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = $1\n AND tc.table_schema = $2\n ",[a,r]);case 17:return m=n.sent,l=m.rows,n.next=21,t.query(i,[a,r]);case 21:_=n.sent,E=_.rows,p={},N=e.createForOfIteratorHelper(l);try{for(N.s();!(f=N.n()).done;)A=f.value,p[A.foreign_table_name]={relation:"BelongsToOneRelation",relatedTable:A.foreign_table_name,foreignKey:A.column_name,localKey:A.foreign_column_name}}catch(e){N.e(e)}finally{N.f()}g=e.createForOfIteratorHelper(E);try{for(g.s();!(h=g.n()).done;)b=h.value,p[b.table_name]={relation:"HasManyRelation",relatedTable:b.table_name,foreignKey:b.foreign_column_name,localKey:b.column_name}}catch(e){g.e(e)}finally{g.f()}return n.abrupt("return",p);case 29:n.next=35;break;case 31:throw n.prev=31,n.t0=n.catch(2),console.error("Error fetching table relations:",n.t0),n.t0;case 35:case"end":return n.stop()}}),n,null,[[2,31]])})));return function(e,t){return n.apply(this,arguments)}}(),c=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t){var a,r,o,c,s,u,i,m,l,_=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=_.length>1&&void 0!==_[1]?_[1]:"public",r=_.length>2&&void 0!==_[2]?_[2]:"pg",e.prev=2,"mysql"===r?(o="\n SELECT *\n FROM information_schema.tables\n WHERE table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('migrations', '_prisma_migrations')\n ",c=[a]):(o="\n SELECT *\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_schema NOT IN ('information_schema', 'pg_catalog')\n AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('migrations', '_prisma_migrations', 'migrations_lock')\n ",c=[a]),e.next=6,t.query(o,c);case 6:return s=e.sent,u=s.rows,i=void 0===u?[]:u,m=s[0],l=void 0===m?[]:m,e.abrupt("return",i.length?i:l);case 14:throw e.prev=14,e.t0=e.catch(2),console.error("Error fetching tables:",e.t0),e.t0;case 18:case"end":return e.stop()}}),n,null,[[2,14]])})));return function(e){return n.apply(this,arguments)}}();exports.capitalize=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},exports.checkDatabaseConnection=n,exports.extractEnumValue=function(e){if(!e)return null;var n=e.match(/^'(.+?)'::/);return n?n[1]:e},exports.getEnumFieldsAndValues=r,exports.getPrimaryKeys=a,exports.getTableColumns=t,exports.getTableRelations=o,exports.getTables=c,exports.removePluralSuffix=function(e){var n={children:"child",men:"man",women:"woman",mice:"mouse",geese:"goose",feet:"foot",teeth:"tooth",people:"person",data:"datum",criteria:"criterion",fungi:"fungus",nuclei:"nucleus",cacti:"cactus"};return n[e.toLowerCase()]?n[e.toLowerCase()]:/(ies)$/.test(e)?e.replace(/ies$/,"y"):/(ves)$/.test(e)?e.replace(/ves$/,"f"):/(oes|xes|ses|shes|ches|zes)$/.test(e)?e.replace(/(oes|xes|ses|shes|ches|zes)$/,""):/(s)$/.test(e)&&!/(ss)$/.test(e)?e.replace(/s$/,""):e},exports.toCamelCase=function(e){return e.replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().replace(/[-_\s]+(.)?/g,(function(e,n){return n?n.toUpperCase():""}))},exports.toKebabCase=function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()};
|
|
2
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./_virtual/_rollupPluginBabelHelpers.js");require("path");var n=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t){return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,t.query("SELECT 1");case 3:console.log("Connection success"),e.next=10;break;case 6:e.prev=6,e.t0=e.catch(0),console.error("Gagal terhubung ke database:",e.t0),process.exit(1);case 10:case"end":return e.stop()}}),n,null,[[0,6]])})));return function(e){return n.apply(this,arguments)}}(),t=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=E.length>2&&void 0!==E[2]?E[2]:"public",o=E.length>3&&void 0!==E[3]?E[3]:"pg",e.prev=2,"pg"===o?(c="\n SELECT *\n FROM information_schema.columns\n WHERE table_catalog = current_database()\n AND table_name = $1\n AND table_schema = $2\n ",s=[a,r]):(c="\n SELECT *\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n ",s=[r,a]),e.next=6,t.query(c,s);case 6:return u=e.sent,i=u.rows,m=void 0===i?[]:i,l=u[0],_=void 0===l?[]:l,e.abrupt("return",m.length?m:_);case 14:throw e.prev=14,e.t0=e.catch(2),console.error("Gagal mengambil informasi tabel:",e.t0),e.t0;case 18:case"end":return e.stop()}}),n,null,[[2,14]])})));return function(e,t){return n.apply(this,arguments)}}(),a=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E,p=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=p.length>2&&void 0!==p[2]?p[2]:"public",o=p.length>3&&void 0!==p[3]?p[3]:"pg",e.prev=2,"pg"===o?(c="\n SELECT a.attname as column_name\n FROM pg_index i\n JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)\n JOIN pg_class c ON c.oid = i.indrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE i.indisprimary = true\n AND c.relname = $1\n AND n.nspname = $2\n ",s=[a,r]):(c="\n SELECT COLUMN_NAME AS column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND CONSTRAINT_NAME = 'PRIMARY'\n ",s=[r,a]),e.next=6,t.query(c,s);case 6:return u=e.sent,i=u.rows,m=void 0===i?[]:i,l=u[0],_=void 0===l?[]:l,E=m.length?m:_,e.abrupt("return",E.map((function(e){return e.column_name})));case 15:throw e.prev=15,e.t0=e.catch(2),console.error("Error fetching primary keys:",e.t0),e.t0;case 19:case"end":return e.stop()}}),n,null,[[2,15]])})));return function(e,t){return n.apply(this,arguments)}}(),r=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E=arguments;return e.regeneratorRuntime().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(r=E.length>2&&void 0!==E[2]?E[2]:"public",o=E.length>3&&void 0!==E[3]?E[3]:"pg",n.prev=2,"mysql"!==o){n.next=13;break}return"\n SELECT COLUMN_NAME, COLUMN_TYPE\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n AND data_type = 'enum'\n ",n.next=7,t.query("\n SELECT COLUMN_NAME, COLUMN_TYPE\n FROM information_schema.columns\n WHERE table_schema = ?\n AND table_name = ?\n AND data_type = 'enum'\n ",[r,a]);case 7:return c=n.sent,s=e.slicedToArray(c,1),u=s[0],n.abrupt("return",u.map((function(e){return{column_name:e.COLUMN_NAME,enum_name:e.COLUMN_NAME,values:e.COLUMN_TYPE.replace(/^enum\((.*)\)$/,"$1").split(",").map((function(e){return e.trim().replace(/^'|'$/g,"")}))}})));case 13:return"\n SELECT column_name, udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND data_type = 'USER-DEFINED'\n ",n.next=16,t.query("\n SELECT column_name, udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND data_type = 'USER-DEFINED'\n ",[r,a]);case 16:if(0!==(i=n.sent).rows.length){n.next=19;break}return n.abrupt("return",[]);case 19:return m=i.rows.map((function(e){return e.udt_name})),"\n SELECT t.typname as enum_name, e.enumlabel as value\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON n.oid = t.typnamespace\n WHERE t.typname = ANY($1)\n ORDER BY t.typname, e.enumsortorder\n ",n.next=23,t.query("\n SELECT t.typname as enum_name, e.enumlabel as value\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON n.oid = t.typnamespace\n WHERE t.typname = ANY($1)\n ORDER BY t.typname, e.enumsortorder\n ",[m]);case 23:return l=n.sent,_=l.rows.reduce((function(e,n){return e[n.enum_name]=e[n.enum_name]||[],e[n.enum_name].push(n.value),e}),{}),n.abrupt("return",i.rows.map((function(e){return{column_name:e.column_name,enum_name:e.udt_name,values:_[e.udt_name]||[]}})));case 26:n.next=32;break;case 28:throw n.prev=28,n.t0=n.catch(2),console.error("Error fetching ENUM fields:",n.t0),n.t0;case 32:case"end":return n.stop()}}),n,null,[[2,28]])})));return function(e,t){return n.apply(this,arguments)}}(),o=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t,a){var r,o,c,s,u,i,m,l,_,E,p,N,f,A,g,h,b,O=arguments;return e.regeneratorRuntime().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(r=O.length>2&&void 0!==O[2]?O[2]:"public",o=O.length>3&&void 0!==O[3]?O[3]:"pg",n.prev=2,"mysql"!==o){n.next=13;break}return"\n SELECT \n TABLE_NAME,\n COLUMN_NAME,\n REFERENCED_TABLE_NAME AS foreign_table_name,\n REFERENCED_COLUMN_NAME AS foreign_column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND REFERENCED_TABLE_NAME IS NOT NULL\n ",n.next=7,t.query("\n SELECT \n TABLE_NAME,\n COLUMN_NAME,\n REFERENCED_TABLE_NAME AS foreign_table_name,\n REFERENCED_COLUMN_NAME AS foreign_column_name\n FROM information_schema.KEY_COLUMN_USAGE\n WHERE TABLE_SCHEMA = ?\n AND TABLE_NAME = ?\n AND REFERENCED_TABLE_NAME IS NOT NULL\n ",[r,a]);case 7:return c=n.sent,s=e.slicedToArray(c,1),u=s[0],n.abrupt("return",u.map((function(e){return{relation:"BelongsToOneRelation",relatedTable:e.foreign_table_name,foreignKey:e.COLUMN_NAME,localKey:e.foreign_column_name}})));case 13:return"\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = $1\n AND tc.table_schema = $2\n ",i="\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND ccu.table_name = $1\n AND tc.table_schema = $2\n ",n.next=17,t.query("\n SELECT \n tc.table_name,\n kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu \n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu \n ON ccu.constraint_name = tc.constraint_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_name = $1\n AND tc.table_schema = $2\n ",[a,r]);case 17:return m=n.sent,l=m.rows,n.next=21,t.query(i,[a,r]);case 21:_=n.sent,E=_.rows,p={},N=e.createForOfIteratorHelper(l);try{for(N.s();!(f=N.n()).done;)A=f.value,p[A.foreign_table_name]={relation:"BelongsToOneRelation",relatedTable:A.foreign_table_name,foreignKey:A.column_name,localKey:A.foreign_column_name}}catch(e){N.e(e)}finally{N.f()}g=e.createForOfIteratorHelper(E);try{for(g.s();!(h=g.n()).done;)b=h.value,p[b.table_name]={relation:"HasManyRelation",relatedTable:b.table_name,foreignKey:b.foreign_column_name,localKey:b.column_name}}catch(e){g.e(e)}finally{g.f()}return n.abrupt("return",p);case 29:n.next=35;break;case 31:throw n.prev=31,n.t0=n.catch(2),console.error("Error fetching table relations:",n.t0),n.t0;case 35:case"end":return n.stop()}}),n,null,[[2,31]])})));return function(e,t){return n.apply(this,arguments)}}(),c=function(){var n=e.asyncToGenerator(e.regeneratorRuntime().mark((function n(t){var a,r,o,c,s,u,i,m,l,_=arguments;return e.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=_.length>1&&void 0!==_[1]?_[1]:"public",r=_.length>2&&void 0!==_[2]?_[2]:"pg",e.prev=2,"mysql"===r?(o="\n SELECT *\n FROM information_schema.tables\n WHERE table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('migrations', '_prisma_migrations')\n ",c=[a]):(o="\n SELECT *\n FROM information_schema.tables\n WHERE table_schema = $1\n AND table_schema NOT IN ('information_schema', 'pg_catalog')\n AND table_type = 'BASE TABLE'\n AND table_name NOT IN ('migrations', '_prisma_migrations', 'migrations_lock')\n ",c=[a]),e.next=6,t.query(o,c);case 6:return s=e.sent,u=s.rows,i=void 0===u?[]:u,m=s[0],l=void 0===m?[]:m,e.abrupt("return",i.length?i:l);case 14:throw e.prev=14,e.t0=e.catch(2),console.error("Error fetching tables:",e.t0),e.t0;case 18:case"end":return e.stop()}}),n,null,[[2,14]])})));return function(e){return n.apply(this,arguments)}}();exports.capitalize=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},exports.checkDatabaseConnection=n,exports.extractEnumValue=function(e){if(!e)return null;var n=e.match(/^'(.+?)'::/);return n?n[1]:e},exports.getEnumFieldsAndValues=r,exports.getPrimaryKeys=a,exports.getTableColumns=t,exports.getTableRelations=o,exports.getTables=c,exports.removePluralSuffix=function(e){var n={children:"child",men:"man",women:"woman",mice:"mouse",geese:"goose",feet:"foot",teeth:"tooth",people:"person",data:"datum",criteria:"criterion",fungi:"fungus",nuclei:"nucleus",cacti:"cactus"};return n[e.toLowerCase()]?n[e.toLowerCase()]:/(ies)$/.test(e)?e.replace(/ies$/,"y"):/(ves)$/.test(e)?e.replace(/ves$/,"f"):/(oes|xes|ses|shes|ches|zes)$/.test(e)?e.replace(/(oes|xes|ses|shes|ches|zes)$/,""):/(s)$/.test(e)&&!/(ss)$/.test(e)?e.replace(/s$/,""):e},exports.toCamelCase=function(e){return e.replace(/[-_]+(.)?/g,(function(e,n){return n?n.toUpperCase():""})).replace(/^[A-Z]/,(function(e){return e.toLowerCase()}))},exports.toKebabCase=function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").toLowerCase()},exports.toPascalCase=function(e){return e.replace(/[_\-\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase().split(" ").map((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})).join("")};
|