@bejibun/core 0.1.29 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/bun.lock +222 -0
  3. package/index.d.ts +1 -0
  4. package/index.js +1 -0
  5. package/index.ts +1 -0
  6. package/package.json +2 -35
  7. package/src/bases/BaseController.ts +139 -0
  8. package/src/bases/BaseModel.ts +107 -0
  9. package/src/bases/BaseValidator.ts +8 -0
  10. package/src/bootstrap.ts +13 -0
  11. package/src/builders/ChalkBuilder.ts +60 -0
  12. package/src/builders/EnumBuilder.ts +32 -0
  13. package/src/builders/ResponseBuilder.ts +54 -0
  14. package/src/builders/RouterBuilder.ts +173 -0
  15. package/src/builders/StrBuilder.ts +25 -0
  16. package/src/config/cors.ts +10 -0
  17. package/src/config/database.ts +27 -0
  18. package/src/enums/CorsHeaderEnum.ts +9 -0
  19. package/src/enums/HttpMethodEnum.ts +13 -0
  20. package/src/exceptions/ModelNotFoundException.ts +15 -0
  21. package/src/exceptions/RouterInvalidException.ts +15 -0
  22. package/src/exceptions/ValidatorException.ts +15 -0
  23. package/src/facades/Chalk.ts +7 -0
  24. package/src/facades/Enum.ts +10 -0
  25. package/src/facades/Response.ts +15 -0
  26. package/src/facades/Router.ts +89 -0
  27. package/src/facades/SoftDeletes.ts +66 -0
  28. package/src/facades/Str.ts +7 -0
  29. package/src/index.ts +11 -0
  30. package/src/types/index.d.ts +2 -0
  31. package/src/utils/utils.ts +72 -0
  32. package/src/utils/vine.ts +2 -0
  33. package/src/utils/vines/exists.ts +41 -0
  34. package/src/utils/vines/unique.ts +41 -0
  35. package/tsconfig.json +17 -0
  36. package/dist/types/index.d.ts +0 -4
  37. /package/{dist → src}/bases/BaseController.d.ts +0 -0
  38. /package/{dist → src}/bases/BaseController.js +0 -0
  39. /package/{dist → src}/bases/BaseModel.d.ts +0 -0
  40. /package/{dist → src}/bases/BaseModel.js +0 -0
  41. /package/{dist → src}/bases/BaseValidator.d.ts +0 -0
  42. /package/{dist → src}/bases/BaseValidator.js +0 -0
  43. /package/{dist → src}/bootstrap.d.ts +0 -0
  44. /package/{dist → src}/bootstrap.js +0 -0
  45. /package/{dist → src}/builders/ChalkBuilder.d.ts +0 -0
  46. /package/{dist → src}/builders/ChalkBuilder.js +0 -0
  47. /package/{dist → src}/builders/EnumBuilder.d.ts +0 -0
  48. /package/{dist → src}/builders/EnumBuilder.js +0 -0
  49. /package/{dist → src}/builders/ResponseBuilder.d.ts +0 -0
  50. /package/{dist → src}/builders/ResponseBuilder.js +0 -0
  51. /package/{dist → src}/builders/RouterBuilder.d.ts +0 -0
  52. /package/{dist → src}/builders/RouterBuilder.js +0 -0
  53. /package/{dist → src}/builders/StrBuilder.d.ts +0 -0
  54. /package/{dist → src}/builders/StrBuilder.js +0 -0
  55. /package/{dist → src}/config/cors.d.ts +0 -0
  56. /package/{dist → src}/config/cors.js +0 -0
  57. /package/{dist → src}/config/database.d.ts +0 -0
  58. /package/{dist → src}/config/database.js +0 -0
  59. /package/{dist → src}/enums/CorsHeaderEnum.d.ts +0 -0
  60. /package/{dist → src}/enums/CorsHeaderEnum.js +0 -0
  61. /package/{dist → src}/enums/HttpMethodEnum.d.ts +0 -0
  62. /package/{dist → src}/enums/HttpMethodEnum.js +0 -0
  63. /package/{dist → src}/exceptions/ModelNotFoundException.d.ts +0 -0
  64. /package/{dist → src}/exceptions/ModelNotFoundException.js +0 -0
  65. /package/{dist → src}/exceptions/RouterInvalidException.d.ts +0 -0
  66. /package/{dist → src}/exceptions/RouterInvalidException.js +0 -0
  67. /package/{dist → src}/exceptions/ValidatorException.d.ts +0 -0
  68. /package/{dist → src}/exceptions/ValidatorException.js +0 -0
  69. /package/{dist → src}/facades/Chalk.d.ts +0 -0
  70. /package/{dist → src}/facades/Chalk.js +0 -0
  71. /package/{dist → src}/facades/Enum.d.ts +0 -0
  72. /package/{dist → src}/facades/Enum.js +0 -0
  73. /package/{dist → src}/facades/Response.d.ts +0 -0
  74. /package/{dist → src}/facades/Response.js +0 -0
  75. /package/{dist → src}/facades/Router.d.ts +0 -0
  76. /package/{dist → src}/facades/Router.js +0 -0
  77. /package/{dist → src}/facades/SoftDeletes.d.ts +0 -0
  78. /package/{dist → src}/facades/SoftDeletes.js +0 -0
  79. /package/{dist → src}/facades/Str.d.ts +0 -0
  80. /package/{dist → src}/facades/Str.js +0 -0
  81. /package/{dist → src}/index.d.ts +0 -0
  82. /package/{dist → src}/index.js +0 -0
  83. /package/{dist → src}/types/middleware.d.ts +0 -0
  84. /package/{dist → src}/types/router.d.ts +0 -0
  85. /package/{dist → src}/types/validator.d.ts +0 -0
  86. /package/{dist → src}/types/vine.d.ts +0 -0
  87. /package/{dist → src}/utils/utils.d.ts +0 -0
  88. /package/{dist → src}/utils/utils.js +0 -0
  89. /package/{dist → src}/utils/vine.d.ts +0 -0
  90. /package/{dist → src}/utils/vine.js +0 -0
  91. /package/{dist → src}/utils/vines/exists.d.ts +0 -0
  92. /package/{dist → src}/utils/vines/exists.js +0 -0
  93. /package/{dist → src}/utils/vines/unique.d.ts +0 -0
  94. /package/{dist → src}/utils/vines/unique.js +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,41 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ---
5
+
6
+ ## [v0.1.23](https://github.com/crenata/bejibun-core/compare/v0.1.18...v0.1.23) - 2025-10-14
7
+
8
+ ### 🩹 Fixes
9
+
10
+ ### 📖 Changes
11
+ New Features :
12
+ - Base class (Controller, Model, Validator)
13
+ - Bootstrap for startup load
14
+ - Adding some utils (Chalk, Response, Router, Soft Deletes)
15
+ - Adding some types (Middleware, Router, Validator, etc)
16
+ - Vine validation macro for `exists` and `unique`
17
+ - Adding validation exception
18
+
19
+ ### ❤️Contributors
20
+ - Havea Crenata ([@crenata](https://github.com/crenata))
21
+ - Ghulje ([@ghulje](https://github.com/ghulje))
22
+
23
+ **Full Changelog**: https://github.com/crenata/bejibun-core/blob/master/CHANGELOG.md
24
+
25
+ ---
26
+
27
+ ## [v0.1.18](https://github.com/crenata/bejibun-core/compare/v0.1.0...v0.1.18) - 2025-10-12
28
+
29
+ ### 🩹 Fixes
30
+
31
+ ### 📖 Changes
32
+ New Features :
33
+ - Enum helper
34
+ - Str helper
35
+ - Some util functions
36
+
37
+ ### ❤️Contributors
38
+ - Havea Crenata ([@crenata](https://github.com/crenata))
39
+ - Ghulje ([@ghulje](https://github.com/ghulje))
40
+
41
+ **Full Changelog**: https://github.com/crenata/bejibun-core/blob/master/CHANGELOG.md
package/bun.lock ADDED
@@ -0,0 +1,222 @@
1
+ {
2
+ "lockfileVersion": 1,
3
+ "workspaces": {
4
+ "": {
5
+ "name": "@bejibun/core",
6
+ "dependencies": {
7
+ "@vinejs/vine": "^3.0.1",
8
+ "chalk": "^5.6.2",
9
+ "knex": "^3.1.0",
10
+ "luxon": "^3.7.2",
11
+ "objection": "^3.1.5",
12
+ "pg": "^8.16.3",
13
+ },
14
+ "devDependencies": {
15
+ "@types/bun": "latest",
16
+ "@types/luxon": "^3.7.1",
17
+ "tsc-alias": "^1.8.16",
18
+ },
19
+ },
20
+ },
21
+ "packages": {
22
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
23
+
24
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
25
+
26
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
27
+
28
+ "@poppinss/macroable": ["@poppinss/macroable@1.1.0", "", {}, "sha512-y/YKzZDuG8XrpXpM7Z1RdQpiIc0MAKyva24Ux1PB4aI7RiSI/79K8JVDcdyubriTm7vJ1LhFs8CrZpmPnx/8Pw=="],
29
+
30
+ "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="],
31
+
32
+ "@types/luxon": ["@types/luxon@3.7.1", "", {}, "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg=="],
33
+
34
+ "@types/node": ["@types/node@24.7.2", "", { "dependencies": { "undici-types": "~7.14.0" } }, "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA=="],
35
+
36
+ "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
37
+
38
+ "@types/validator": ["@types/validator@13.15.3", "", {}, "sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q=="],
39
+
40
+ "@vinejs/compiler": ["@vinejs/compiler@3.0.0", "", {}, "sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw=="],
41
+
42
+ "@vinejs/vine": ["@vinejs/vine@3.0.1", "", { "dependencies": { "@poppinss/macroable": "^1.0.4", "@types/validator": "^13.12.2", "@vinejs/compiler": "^3.0.0", "camelcase": "^8.0.0", "dayjs": "^1.11.13", "dlv": "^1.1.3", "normalize-url": "^8.0.1", "validator": "^13.12.0" } }, "sha512-ZtvYkYpZOYdvbws3uaOAvTFuvFXoQGAtmzeiXu+XSMGxi5GVsODpoI9Xu9TplEMuD/5fmAtBbKb9cQHkWkLXDQ=="],
43
+
44
+ "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
45
+
46
+ "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
47
+
48
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
49
+
50
+ "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
51
+
52
+ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
53
+
54
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
55
+
56
+ "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="],
57
+
58
+ "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="],
59
+
60
+ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
61
+
62
+ "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
63
+
64
+ "colorette": ["colorette@2.0.19", "", {}, "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="],
65
+
66
+ "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
67
+
68
+ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
69
+
70
+ "dayjs": ["dayjs@1.11.18", "", {}, "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA=="],
71
+
72
+ "db-errors": ["db-errors@0.2.3", "", {}, "sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng=="],
73
+
74
+ "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="],
75
+
76
+ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
77
+
78
+ "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
79
+
80
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
81
+
82
+ "esm": ["esm@3.2.25", "", {}, "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="],
83
+
84
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
85
+
86
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
87
+
88
+ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
89
+
90
+ "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
91
+
92
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
93
+
94
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
95
+
96
+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
97
+
98
+ "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="],
99
+
100
+ "get-tsconfig": ["get-tsconfig@4.12.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw=="],
101
+
102
+ "getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="],
103
+
104
+ "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
105
+
106
+ "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
107
+
108
+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
109
+
110
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
111
+
112
+ "interpret": ["interpret@2.2.0", "", {}, "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="],
113
+
114
+ "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
115
+
116
+ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
117
+
118
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
119
+
120
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
121
+
122
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
123
+
124
+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
125
+
126
+ "knex": ["knex@3.1.0", "", { "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", "debug": "4.3.4", "escalade": "^3.1.1", "esm": "^3.2.25", "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", "lodash": "^4.17.21", "pg-connection-string": "2.6.2", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", "tarn": "^3.0.2", "tildify": "2.0.0" }, "bin": { "knex": "bin/cli.js" } }, "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw=="],
127
+
128
+ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
129
+
130
+ "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="],
131
+
132
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
133
+
134
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
135
+
136
+ "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
137
+
138
+ "mylas": ["mylas@2.1.13", "", {}, "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg=="],
139
+
140
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
141
+
142
+ "normalize-url": ["normalize-url@8.1.0", "", {}, "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w=="],
143
+
144
+ "objection": ["objection@3.1.5", "", { "dependencies": { "ajv": "^8.17.1", "ajv-formats": "^2.1.1", "db-errors": "^0.2.3" }, "peerDependencies": { "knex": ">=1.0.1" } }, "sha512-Hx/ipAwXSuRBbOMWFKtRsAN0yITafqXtWB4OT4Z9wED7ty1h7bOnBdhLtcNus23GwLJqcMsRWdodL2p5GwlnfQ=="],
145
+
146
+ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
147
+
148
+ "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
149
+
150
+ "pg": ["pg@8.16.3", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="],
151
+
152
+ "pg-cloudflare": ["pg-cloudflare@1.2.7", "", {}, "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg=="],
153
+
154
+ "pg-connection-string": ["pg-connection-string@2.6.2", "", {}, "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="],
155
+
156
+ "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="],
157
+
158
+ "pg-pool": ["pg-pool@3.10.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg=="],
159
+
160
+ "pg-protocol": ["pg-protocol@1.10.3", "", {}, "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ=="],
161
+
162
+ "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="],
163
+
164
+ "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="],
165
+
166
+ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
167
+
168
+ "plimit-lit": ["plimit-lit@1.6.1", "", { "dependencies": { "queue-lit": "^1.5.1" } }, "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA=="],
169
+
170
+ "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="],
171
+
172
+ "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="],
173
+
174
+ "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="],
175
+
176
+ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="],
177
+
178
+ "queue-lit": ["queue-lit@1.5.2", "", {}, "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw=="],
179
+
180
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
181
+
182
+ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
183
+
184
+ "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="],
185
+
186
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
187
+
188
+ "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
189
+
190
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
191
+
192
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
193
+
194
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
195
+
196
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
197
+
198
+ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
199
+
200
+ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
201
+
202
+ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
203
+
204
+ "tarn": ["tarn@3.0.2", "", {}, "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="],
205
+
206
+ "tildify": ["tildify@2.0.0", "", {}, "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="],
207
+
208
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
209
+
210
+ "tsc-alias": ["tsc-alias@1.8.16", "", { "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "get-tsconfig": "^4.10.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" }, "bin": { "tsc-alias": "dist/bin/index.js" } }, "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g=="],
211
+
212
+ "undici-types": ["undici-types@7.14.0", "", {}, "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA=="],
213
+
214
+ "validator": ["validator@13.15.15", "", {}, "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A=="],
215
+
216
+ "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
217
+
218
+ "knex/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
219
+
220
+ "pg/pg-connection-string": ["pg-connection-string@2.9.1", "", {}, "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w=="],
221
+ }
222
+ }
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bejibun/core",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "author": "Havea Crenata <havea.crenata@gmail.com>",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,43 +21,10 @@
21
21
  "@types/luxon": "^3.7.1",
22
22
  "tsc-alias": "^1.8.16"
23
23
  },
24
- "exports": {
25
- ".": {
26
- "import": "./dist/index.js",
27
- "types": "./dist/index.d.ts"
28
- },
29
- "./bootstrap": {
30
- "import": "./dist/bootstrap.js",
31
- "types": "./dist/bootstrap.d.ts"
32
- },
33
- "./bases/*": {
34
- "import": "./dist/bases/*.js",
35
- "types": "./dist/bases/*.d.ts"
36
- },
37
- "./enums/*": {
38
- "import": "./dist/enums/*.js",
39
- "types": "./dist/enums/*.d.ts"
40
- },
41
- "./exceptions/*": {
42
- "import": "./dist/exceptions/*.js",
43
- "types": "./dist/exceptions/*.d.ts"
44
- },
45
- "./facades/*": {
46
- "import": "./dist/facades/*.js",
47
- "types": "./dist/facades/*.d.ts"
48
- },
49
- "./types/*": {
50
- "import": "./dist/types/*.js",
51
- "types": "./dist/types/*.d.ts"
52
- }
53
- },
54
24
  "bugs": {
55
25
  "url": "https://github.com/crenata/bejibun-core/issues"
56
26
  },
57
27
  "description": "Core of Bejibun Framework",
58
- "files": [
59
- "dist"
60
- ],
61
28
  "homepage": "https://github.com/crenata/bejibun-core#readme",
62
29
  "keywords": [
63
30
  "bun",
@@ -69,7 +36,7 @@
69
36
  "license": "MIT",
70
37
  "scripts": {
71
38
  "clean": "rm -rf dist",
72
- "build": "bun run clean && bunx tsc -p tsconfig.json && cp -rf src/types dist/types && bunx tsc-alias -p tsconfig.json",
39
+ "build": "bun run clean && bunx tsc -p tsconfig.json && bunx tsc-alias -p tsconfig.json",
73
40
  "deploy": "bun run build && npm publish --access public"
74
41
  },
75
42
  "type": "module",
@@ -0,0 +1,139 @@
1
+ import {errors, VineValidator} from "@vinejs/vine";
2
+ import {BunRequest} from "bun";
3
+ import {DateTime} from "luxon";
4
+ import ValidatorException from "@/exceptions/ValidatorException";
5
+ import Response from "@/facades/Response";
6
+ import {defineValue, isEmpty, isNotEmpty} from "@/utils/utils";
7
+
8
+ export default class BaseController {
9
+ public async parse(request: BunRequest): Promise<Record<string, any>> {
10
+ const contentType = defineValue(request.headers.get("content-type"), "");
11
+ const formData = new FormData();
12
+
13
+ try {
14
+ if (contentType.includes("application/json")) return await request.json();
15
+
16
+ for (const [key, value] of Object.entries(request.params)) {
17
+ formData.append(key, value as string);
18
+ }
19
+
20
+ const url = new URL(request.url);
21
+ for (const [key, value] of url.searchParams) {
22
+ formData.append(key, value);
23
+ }
24
+
25
+ if (
26
+ contentType.includes("multipart/form-data") ||
27
+ contentType.includes("application/x-www-form-urlencoded")
28
+ ) {
29
+ const body = await request.formData();
30
+
31
+ for (const [key, value] of body) {
32
+ formData.append(key, value);
33
+ }
34
+ }
35
+
36
+ const text = await request.text();
37
+ if (isNotEmpty(text)) formData.append("text", text);
38
+ } catch {
39
+ // do nothing
40
+ }
41
+
42
+ return this.parseForm(formData);
43
+ }
44
+
45
+ public get response(): typeof Response {
46
+ return Response;
47
+ }
48
+
49
+ public async validate(validator: VineValidator<any, Record<string, any> | undefined>, body: Record<string, any>): Promise<any> {
50
+ try {
51
+ return await validator.validate(body);
52
+ } catch (error: typeof errors.E_VALIDATION_ERROR | any) {
53
+ throw new ValidatorException(error.messages[0].message);
54
+ }
55
+ }
56
+
57
+ private serialize(data: any): any {
58
+ if (Array.isArray(data)) return data.map((value: any) => this.serialize(value));
59
+
60
+ if (data === null || data === undefined) return null;
61
+
62
+ if (data instanceof DateTime) return data.isValid ? data.toISO() : null;
63
+
64
+ if (data instanceof Date) return Number.isNaN(data.getTime()) ? null : data.toISOString();
65
+
66
+ if (typeof data === "object" && !(data instanceof File)) {
67
+ if (Object.keys(data).length === 0) return null;
68
+
69
+ const nested: Record<string, any> = {};
70
+ Object.keys(data).forEach((key: string) => {
71
+ nested[key] = this.serialize(data[key]);
72
+ });
73
+
74
+ return nested;
75
+ }
76
+
77
+ if (typeof data === "string") {
78
+ const trimmed: string = data.trim();
79
+
80
+ if (trimmed === "") return null;
81
+ if (trimmed === "true") return true;
82
+ if (trimmed === "false") return false;
83
+
84
+ const numeric = Number(trimmed);
85
+ if (!Number.isNaN(numeric) && trimmed === numeric.toString()) return numeric;
86
+
87
+ return trimmed;
88
+ }
89
+
90
+ return data;
91
+ }
92
+
93
+ private parseForm(formData: FormData): Record<string, any> {
94
+ const result: Record<string, any> = {};
95
+
96
+ for (const [key, value] of formData.entries()) {
97
+ const keys = key.replace(/]/g, "").split("[");
98
+
99
+ let current: any = result;
100
+
101
+ for (let i = 0; i < keys.length; i++) {
102
+ const part = keys[i];
103
+ const nextPart = keys[i + 1];
104
+
105
+ if (i === keys.length - 1) {
106
+ let convertedValue: any;
107
+
108
+ if (value as unknown instanceof File) {
109
+ convertedValue = value;
110
+ } else if (value.trim() === "") {
111
+ convertedValue = null;
112
+ } else if (Number.isNaN(value)) {
113
+ convertedValue = Number(value);
114
+ } else if (value === "true" || value === "false") {
115
+ convertedValue = value === "true";
116
+ } else {
117
+ try {
118
+ convertedValue = JSON.parse(value);
119
+ } catch {
120
+ convertedValue = value;
121
+ }
122
+ }
123
+
124
+ if (current[part] === undefined) current[part] = convertedValue;
125
+ else if (Array.isArray(current[part])) current[part].push(convertedValue);
126
+ else current[part] = [current[part], convertedValue];
127
+ } else {
128
+ const isArrayIndex = /^\d+$/.test(nextPart);
129
+
130
+ if (isEmpty(current[part])) current[part] = isArrayIndex ? [] : {};
131
+
132
+ current = current[part];
133
+ }
134
+ }
135
+ }
136
+
137
+ return result;
138
+ }
139
+ }
@@ -0,0 +1,107 @@
1
+ import {DateTime} from "luxon";
2
+ import {
3
+ Constructor,
4
+ Model,
5
+ ModelOptions,
6
+ PartialModelObject,
7
+ QueryBuilder,
8
+ QueryBuilderType,
9
+ QueryContext,
10
+ TransactionOrKnex
11
+ } from "objection";
12
+ import {relative, sep} from "path";
13
+ import {fileURLToPath} from "url";
14
+ import ModelNotFoundException from "@/exceptions/ModelNotFoundException";
15
+ import SoftDeletes from "@/facades/SoftDeletes";
16
+ import Str from "@/facades/Str";
17
+ import {defineValue, isEmpty} from "@/utils/utils";
18
+
19
+ export interface BaseColumns {
20
+ id: bigint | number;
21
+ created_at: DateTime | string;
22
+ updated_at: DateTime | string;
23
+ deleted_at: DateTime | string | null;
24
+ }
25
+
26
+ class BunQueryBuilder<M extends Model, R = M[]> extends SoftDeletes<M, R> {
27
+ // @ts-ignore
28
+ async update(payload: PartialModelObject<M>): Promise<QueryBuilder<M, R>> {
29
+ const cloneQuery: QueryBuilder<M, R> = (this as any).clone();
30
+
31
+ const beforeRows: any = await cloneQuery;
32
+
33
+ if (isEmpty(beforeRows)) return defineValue(beforeRows);
34
+
35
+ await super.update(payload);
36
+
37
+ return cloneQuery;
38
+ }
39
+ }
40
+
41
+ // @ts-ignore
42
+ export default class BaseModel extends Model implements BaseColumns {
43
+ public static tableName: string;
44
+ public static idColumn: string;
45
+ public static deletedColumn: string = "deleted_at";
46
+
47
+ public static QueryBuilder = BunQueryBuilder;
48
+
49
+ declare id: number | bigint;
50
+ declare created_at: DateTime | string;
51
+ declare updated_at: DateTime | string;
52
+ declare deleted_at: DateTime | string | null;
53
+
54
+ public static get namespace(): string {
55
+ const filePath = fileURLToPath(import.meta.url);
56
+ const appRoot = process.cwd();
57
+ const rel = relative(appRoot, filePath);
58
+ const withoutExt = rel.replace(/\.[tj]s$/, "");
59
+ const namespaces = withoutExt.split(sep);
60
+ namespaces.pop();
61
+ namespaces.push(this.name);
62
+
63
+ return namespaces.map(part => Str.toPascalCase(part)).join("/");
64
+ }
65
+
66
+ $beforeInsert(queryContext: QueryContext): void {
67
+ const now = DateTime.now();
68
+ this.created_at = now;
69
+ this.updated_at = now;
70
+ }
71
+
72
+ $beforeUpdate(opt: ModelOptions, queryContext: QueryContext): void {
73
+ this.updated_at = DateTime.now();
74
+ }
75
+
76
+ public static query<T extends Model>(this: Constructor<T>, trxOrKnex?: TransactionOrKnex): QueryBuilderType<T> {
77
+ return super.query(trxOrKnex);
78
+ };
79
+
80
+ public static withTrashed<T extends Model>(this: T): QueryBuilderType<T> {
81
+ return (this as any).query().withTrashed();
82
+ }
83
+
84
+ public static onlyTrashed<T extends Model>(this: T): QueryBuilderType<T> {
85
+ return (this as any).query().onlyTrashed();
86
+ }
87
+
88
+ public static all<T extends Model>(this: T): QueryBuilderType<T> {
89
+ return (this as any).query().select();
90
+ }
91
+
92
+ public static create<T extends Model>(this: T, payload: Record<string, any>): QueryBuilderType<T> {
93
+ return (this as any).query().insert(payload);
94
+ }
95
+
96
+ public static find<T extends Model>(this: T, id: bigint | number | string): QueryBuilderType<T> {
97
+ return (this as any).query().findById(id);
98
+ }
99
+
100
+ public static async findOrFail<T extends Model>(this: T, id: bigint | number | string): Promise<T> {
101
+ const result = await (this as any).find(id);
102
+
103
+ if (isEmpty(result)) throw new ModelNotFoundException(`[ModelNotFoundException]: No query results for model [${(this as any).namespace}] [${id}].`);
104
+
105
+ return result;
106
+ }
107
+ }
@@ -0,0 +1,8 @@
1
+ import vine from "@vinejs/vine";
2
+ import "@/utils/vine";
3
+
4
+ export default class BaseValidator {
5
+ public static get validator(): typeof vine {
6
+ return vine;
7
+ }
8
+ }
@@ -0,0 +1,13 @@
1
+ import BaseModel from "@/bases/BaseModel";
2
+ import fs from "fs";
3
+ import knex from "knex";
4
+ import path from "path";
5
+
6
+ const configPath = path.resolve(process.cwd(), "config/database.ts");
7
+
8
+ let config: any;
9
+
10
+ if (fs.existsSync(configPath)) config = require(configPath).default;
11
+ else config = require("@/config/database").default;
12
+
13
+ BaseModel.knex(knex(config));