frgen 0.3.8 → 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 CHANGED
@@ -1,65 +1,419 @@
1
- ### Generator
1
+ # 🧰 FRGEN — CLI CRUD Generator
2
2
 
3
- #### Resource
4
- - make:resource "className" "tableName"
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
- npx frgen make:resource UserResource users
211
+ npm install -D prisma-json-schema-generator
8
212
  ```
9
- - shema --schema=schemaName
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 frgen make:resource UserResource users --schema=other_schema
232
+ npx regen <action> [options]
12
233
  ```
13
234
 
14
- #### Controller
15
- - make:controller "className" "tableName"
235
+ ---
236
+
237
+ ## 🚀 Usage
238
+
239
+ ### Basic Command Format
16
240
 
17
241
  ```bash
18
- npx frgen make:controller UserController users --prisma
242
+ npx regen <action> [options]
19
243
  ```
20
- - shema --schema=schemaName
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 frgen make:controller UserController users --schema=other_schema --prisma
264
+ npx regen make:page
23
265
  ```
24
- - path --path=/directory/.../target
266
+
267
+ ---
268
+
269
+ ### **2. `make:dummy`**
270
+ Generates only dummy data based on schema.
271
+
25
272
  ```bash
26
- npx frgen make:controller UserController users --path=/directory/.../target --prisma
273
+ npx regen make:dummy
27
274
  ```
28
275
 
29
- #### Service
30
- - make:service "ServiceName" "tableName"
276
+ ---
277
+
278
+ ### **3. `make:route`**
279
+ Generates route file for all schema definitions.
31
280
 
32
281
  ```bash
33
- npx frgen make:service UserService users --prisma
282
+ npx regen make:route
34
283
  ```
35
- - shema --schema=schemaName
284
+
285
+ ---
286
+
287
+ ### **4. `make:validation`**
288
+ Generates validation files only.
289
+
36
290
  ```bash
37
- npx frgen make:service UserService users --schema=other_schema --prisma
291
+ npx regen make:validation
38
292
  ```
39
- - path --path=/directory/.../target
293
+
294
+ ---
295
+
296
+ ### **5. `make:form`**
297
+ Generates form components only.
298
+
40
299
  ```bash
41
- npx frgen make:service UserService users --path=/directory/.../target --prisma
300
+ npx regen make:form
42
301
  ```
43
302
 
44
- #### Validation
45
- - make:validation "ValidationName" "tableName"
303
+ ---
304
+
305
+ ### **6. `--help`**
306
+ Shows help message.
46
307
 
47
308
  ```bash
48
- npx frgen make:validation UserValidation users
309
+ npx regen --help
49
310
  ```
50
- - shema --schema=schemaName
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 frgen make:validation UserValidation users --schema=other_schema
331
+ npx regen make:page --mui
53
332
  ```
54
333
 
55
- #### ALL
56
- - make:crud "className" "tableName"
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 frgen make:crud --prisma
350
+ npx regen make:page --template=./custom-templates
60
351
  ```
61
- - shema --schema=schemaName
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 frgen make:crud --schema=other_schema --prisma
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.
@@ -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"),u=require("./make_service.js"),l=require("./db.js"),i=r.toArray(process.argv);i[0],i[1];var p=i[2],v=i.slice(3);p||(console.error("❌ action undefined."),process.exit(1));var k="",m="default",f=null!==(e=process.env.DB_SCHEMA)&&void 0!==e?e:"public",x=process.env.DB_CLIENT||"pg",b=!1;if(v.length>0){var d,y=r.createForOfIteratorHelper(v);try{for(y.s();!(d=y.n()).done;){var q=d.value.split("="),g=r.slicedToArray(q,2),h=g[0],_=g[1];"--schema"===h&&(f=_),"--path"===h&&(m=_),"--prisma"===h&&(b=!0),"--mysql"===h&&(x="mysql"),"--pg"===h&&(x="pg"),"--skip-controller"===h&&(skipController=!0),"--table"===h&&(k=_)}}catch(e){y.e(e)}finally{y.f()}k||(console.error("❌ table undefined."),process.exit(1))}if("make:crud"===p){var j=r.toArray(process.argv);j[0],j[1],j[2];var C=j.slice(3);if(C.length>0){var A,B=r.createForOfIteratorHelper(C);try{for(B.s();!(A=B.n()).done;){var D=A.value.split("="),E=r.slicedToArray(D,2),R=E[0],T=E[1];"--schema"===R&&(f=T),"--prisma"===R&&(b=!0),"--pg"===R&&(x="pg"),"--mysql"===R&&(x="mysql",f=process.env.DB_NAME)}}catch(e){B.e(e)}finally{B.f()}}}(function(){var e=r.asyncToGenerator(r.regeneratorRuntime().mark((function e(){var i,v,d,y;return r.regeneratorRuntime().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,process.env.DB_CLIENT=x,e.next=4,l.createPool();case 4:return i=e.sent,e.next=7,a.checkDatabaseConnection(i);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 v="".concat(a.toPascalCase(a.removePluralSuffix(k)),"Controller"),e.next=13,t(v,k,i,f,x);case 13:return e.abrupt("break",37);case 14:return e.next=16,n(k,i,f,x,m);case 16:return e.abrupt("break",37);case 17:return e.next=19,s(k,m);case 19:return e.next=21,u(k,m,b);case 21:return e.next=23,o(k,i,f,x,m);case 23:return e.next=25,n(k,i,f,x,m);case 25:return e.abrupt("break",37);case 26:return e.next=28,c(m,i,f,b,x);case 28:return e.abrupt("break",37);case 29:return e.next=31,o(k,i,f,x,m);case 31:return e.abrupt("break",37);case 32:return e.next=34,u(k,m,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===(d=i)||void 0===d||!d.end){e.next=49;break}return e.next=47,i.end();case 47:e.next=52;break;case 49:if(null===(y=i)||void 0===y||!y.releaseConnection){e.next=52;break}return e.next=52,i.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)}})()();
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)}})()();
@@ -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"),a=require("./utils.js"),r=["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=r.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("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(a.extractEnumValue(d)))}else b=v?d:"'".concat(d,"'");void 0!==e.typeof(b)&&p.push("default(".concat(b,")"))}return"".concat(a.toCamelCase(n),":").concat(p.join("."))}function u(e,n){var t=n.type,i=["z"],u=r.includes(t),l=c.includes(t),s=o.includes(t);return u?i.push("number().int().nonoptional()"):l?i.push("string().nonempty().nonoptional()"):s?i.push("boolean()"):i.push("any()"),"".concat(a.toCamelCase(e),":").concat(i.join("."))}function l(e){return!["created_at","updated_at","createdAt","updatedAt"].includes(e)}var s=function(){var r=e.asyncToGenerator(e.regeneratorRuntime().mark((function r(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(r){for(;;)switch(r.prev=r.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",r.prev=3,c||(console.error("table name undefined"),process.exit(1)),m=a.removePluralSuffix(c),f="".concat(a.toKebabCase(m),".validation.ts"),v="Create".concat(a.toPascalCase(m),"Schema"),h="Update".concat(a.toPascalCase(m),"Schema"),y="create".concat(a.toPascalCase(m),"Schema"),g="update".concat(a.toPascalCase(m),"Schema"),_=t.join(process.cwd(),"src","app","http","validation",f),"default"!==p&&(_=t.join(process.cwd(),p,f)),r.next=15,a.getTableColumns(o,c,s,d);case 15:return b=r.sent,A=Object.fromEntries(b.map((function(e){var n,t,a,r,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!==(a=e.data_type)&&void 0!==a?a:e.DATA_TYPE,maxLength:null!==(r=e.character_maximum_length)&&void 0!==r?r:e.CHARACTER_MAXIMU_LENGTH,nullable:"YES"===(null!==(c=e.is_nullable)&&void 0!==c?c:e.IS_NULLABLE)}]}))),r.next=19,a.getPrimaryKeys(o,c,s,d);case 19:return C=r.sent,r.next=22,a.getEnumFieldsAndValues(o,c,s,d);case 22:x=r.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),r=t[0],c=t[1];return[a.toCamelCase(r),i(r,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),r=t[0],c=t[1];return[a.toCamelCase(r),u(r,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"))})),r.next=36;break;case 33:r.prev=33,r.t0=r.catch(3),console.error("err:",r.t0);case 36:return r.prev=36,r.finish(36);case 38:case"end":return r.stop()}}),r,null,[[3,33,36,38]])})));return function(e,n){return r.apply(this,arguments)}}();module.exports=s;
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","schemas",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"),r=require("fs"),t=require("path"),a=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=t.join(process.cwd(),"json-schema.json");if(o.length>0){var s,u=e.createForOfIteratorHelper(o);try{for(u.s();!(s=u.n()).done;){var l=s.value.split("="),p=e.slicedToArray(l,2),d=p[0],f=p[1];"--mui"===d&&"mui","--file"===d&&(c=f)}}catch(e){u.e(e)}finally{u.f()}}(function(){var t=e.asyncToGenerator(e.regeneratorRuntime().mark((function t(){var n,o;return e.regeneratorRuntime().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:t.prev=0,n=r.readFileSync(c,{encoding:"utf-8"}),o=JSON.parse(n),t.t0=i,t.next="make:page"===t.t0?6:"make:dummy"===t.t0?8:"make:route"===t.t0?10:12;break;case 6:return Object.entries(o.definitions).forEach((function(r){var t=e.slicedToArray(r,2),n=t[0],i=t[1];a.generateService(e.objectSpread2({title:n},i)),a.generateValidation(e.objectSpread2({title:n},i)),a.generateForm(e.objectSpread2({title:n},i)),a.generateIndexPage(e.objectSpread2({title:n},i)),a.generateCreatePage(e.objectSpread2({title:n},i)),a.generateUpdatePage(e.objectSpread2({title:n},i)),a.generateViewPage(e.objectSpread2({title:n},i)),a.jsonToTS(c)})),t.abrupt("break",14);case 8:return Object.entries(o.definitions).forEach((function(r){var t=e.slicedToArray(r,2),n=t[0],i=t[1];a.generateDummy(e.objectSpread2({title:n},i))})),t.abrupt("break",14);case 10:return a.generateRoute(Object.entries(o.definitions).map((function(r){return e.slicedToArray(r,1)[0]}))),t.abrupt("break",14);case 12:console.error("❌ Unknown action: ".concat(i)),process.exit(1);case 14:t.next=19;break;case 16:t.prev=16,t.t1=t.catch(0),console.error("❌ ERROR:",t.t1);case 19:return t.prev=19,t.finish(19);case 21:case"end":return t.stop()}}),t,null,[[0,16,19,21]])})));return function(){return t.apply(this,arguments)}})()();
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frgen",
3
- "version": "0.3.8",
3
+ "version": "0.4.0",
4
4
  "description": "helper generator",
5
5
  "main": "lib/main.jss",
6
6
  "types": "lib/index.d.ts",