@kosmojs/dev 0.0.10 → 0.0.20

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 (193) hide show
  1. package/package.json +9 -42
  2. package/pkg/base-plugin/worker.js +252 -102
  3. package/pkg/base-plugin/worker.js.map +4 -4
  4. package/pkg/index.js +540 -206
  5. package/pkg/index.js.map +4 -4
  6. package/pkg/src/{base-plugin/ast.d.ts → ast.d.ts} +3 -3
  7. package/pkg/src/base-plugin/api-handler.d.ts +1 -1
  8. package/pkg/src/base-plugin/index.d.ts +1 -1
  9. package/pkg/src/base-plugin/worker.d.ts +1 -1
  10. package/pkg/src/{base-plugin/cache.d.ts → cache.d.ts} +2 -2
  11. package/pkg/src/defaults.d.ts +13 -0
  12. package/pkg/src/fs.d.ts +1 -0
  13. package/pkg/src/index.d.ts +6 -3
  14. package/pkg/src/paths.d.ts +13 -0
  15. package/pkg/src/render.d.ts +28 -0
  16. package/pkg/src/routes-factory/base.d.ts +17 -0
  17. package/pkg/src/routes-factory/index.d.ts +8 -0
  18. package/pkg/src/routes-factory/nesting.d.ts +3 -0
  19. package/pkg/src/{base-plugin/routes → routes-factory}/resolve.d.ts +3 -3
  20. package/pkg/src/stub-generator/index.d.ts +1 -1
  21. package/pkg/src/typebox.d.ts +2 -0
  22. package/pkg/src/types.d.ts +288 -0
  23. package/pkg/stub-generator/index.js +166 -24
  24. package/pkg/stub-generator/index.js.map +4 -4
  25. package/pkg/test/routes/{base.d.ts → index.d.ts} +2 -2
  26. package/pkg/base-plugin/routes.js +0 -819
  27. package/pkg/base-plugin/routes.js.map +0 -7
  28. package/pkg/cli/cli.js +0 -582
  29. package/pkg/cli/cli.js.map +0 -7
  30. package/pkg/cli/index.js +0 -422
  31. package/pkg/cli/index.js.map +0 -7
  32. package/pkg/cli/templates/.env +0 -1
  33. package/pkg/cli/templates/@src/api/app.hbs +0 -32
  34. package/pkg/cli/templates/@src/api/router.hbs +0 -11
  35. package/pkg/cli/templates/@src/api/server.hbs +0 -4
  36. package/pkg/cli/templates/@src/api/use.hbs +0 -6
  37. package/pkg/cli/templates/@src/config/index.hbs +0 -2
  38. package/pkg/cli/templates/@src/index.html +0 -4
  39. package/pkg/cli/templates/@src/vite.config.hbs +0 -29
  40. package/pkg/cli/templates/core/api/app.ts +0 -6
  41. package/pkg/cli/templates/core/api/env.d.ts +0 -4
  42. package/pkg/cli/templates/core/api/router.ts +0 -6
  43. package/pkg/cli/templates/core/api/server.ts +0 -49
  44. package/pkg/cli/templates/core/api/use.ts +0 -21
  45. package/pkg/cli/templates/vite.base.hbs +0 -44
  46. package/pkg/src/base-plugin/routes/nesting.d.ts +0 -5
  47. package/pkg/src/base-plugin/routes.d.ts +0 -9
  48. package/pkg/src/cli/base.d.ts +0 -30
  49. package/pkg/src/cli/cli.d.ts +0 -2
  50. package/pkg/src/cli/factory.d.ts +0 -12
  51. package/pkg/src/cli/index.d.ts +0 -2
  52. package/pkg/src/cli/templates/core/api/app.d.ts +0 -3
  53. package/pkg/src/cli/templates/core/api/router.d.ts +0 -3
  54. package/pkg/src/cli/templates/core/api/server.d.ts +0 -3
  55. package/pkg/src/cli/templates/core/api/use.d.ts +0 -2
  56. package/pkg/test/setup.d.ts +0 -1
  57. /package/pkg/test/@fixtures/app/{@src → src/test}/api/articles/[...path]/index.d.ts +0 -0
  58. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/[category]/[[author]]/index.d.ts +0 -0
  59. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/[category]/index.d.ts +0 -0
  60. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/index.d.ts +0 -0
  61. /package/pkg/test/@fixtures/app/{@src → src/test}/api/files/[[folder]]/[[id]].json/index.d.ts +0 -0
  62. /package/pkg/test/@fixtures/app/{@src → src/test}/api/files/[[folder]]/index.d.ts +0 -0
  63. /package/pkg/test/@fixtures/app/{@src → src/test}/api/index/index.d.ts +0 -0
  64. /package/pkg/test/@fixtures/app/{@src → src/test}/api/pages/[...path].html/index.d.ts +0 -0
  65. /package/pkg/test/@fixtures/app/{@src → src/test}/api/users/[id].json/index.d.ts +0 -0
  66. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/careers/[jobId]/index.d.ts +0 -0
  67. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/careers/layout.d.ts +0 -0
  68. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/index.d.ts +0 -0
  69. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/layout.d.ts +0 -0
  70. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/team/index.d.ts +0 -0
  71. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/account/layout.d.ts +0 -0
  72. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/account/profile/index.d.ts +0 -0
  73. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/index.d.ts +0 -0
  74. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  75. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  76. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  77. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/index.d.ts +0 -0
  78. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  79. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  80. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/index.d.ts +0 -0
  81. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  82. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  83. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  84. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/index.d.ts +0 -0
  85. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/layout.d.ts +0 -0
  86. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/index.d.ts +0 -0
  87. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/layout.d.ts +0 -0
  88. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  89. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/[[category]]/index.d.ts +0 -0
  90. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/index.d.ts +0 -0
  91. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/layout.d.ts +0 -0
  92. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/post/[slug]/index.d.ts +0 -0
  93. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/post/[slug]/layout.d.ts +0 -0
  94. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/contact/index.d.ts +0 -0
  95. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/contact/layout.d.ts +0 -0
  96. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/courses/[courseId]/layout.d.ts +0 -0
  97. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  98. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/[view]/index.d.ts +0 -0
  99. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/analytics/index.d.ts +0 -0
  100. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/index.d.ts +0 -0
  101. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/layout.d.ts +0 -0
  102. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/billing/index.d.ts +0 -0
  103. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/index.d.ts +0 -0
  104. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/layout.d.ts +0 -0
  105. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/notifications/index.d.ts +0 -0
  106. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/profile/index.d.ts +0 -0
  107. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/security/index.d.ts +0 -0
  108. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/security/layout.d.ts +0 -0
  109. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/[...path]/index.d.ts +0 -0
  110. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/index.d.ts +0 -0
  111. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/layout.d.ts +0 -0
  112. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/files/[...filePath]/index.d.ts +0 -0
  113. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/files/[...filePath]/layout.d.ts +0 -0
  114. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/layout.d.ts +0 -0
  115. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/privacy/index.d.ts +0 -0
  116. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/terms/index.d.ts +0 -0
  117. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  118. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/news/[category]/layout.d.ts +0 -0
  119. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/layout.d.ts +0 -0
  120. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  121. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  122. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  123. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  124. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/layout.d.ts +0 -0
  125. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/products/[id]/index.d.ts +0 -0
  126. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/products/index.d.ts +0 -0
  127. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/layout.d.ts +0 -0
  128. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  129. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  130. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  131. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/index.d.ts +0 -0
  132. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/layout.d.ts +0 -0
  133. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/index.d.ts +0 -0
  134. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/layout.d.ts +0 -0
  135. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  136. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  137. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  138. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  139. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  140. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  141. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  142. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  143. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/index.d.ts +0 -0
  144. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/layout.d.ts +0 -0
  145. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/index.d.ts +0 -0
  146. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/layout.d.ts +0 -0
  147. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  148. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/filters/index.d.ts +0 -0
  149. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/layout.d.ts +0 -0
  150. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  151. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/[[query]]/layout.d.ts +0 -0
  152. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/index.d.ts +0 -0
  153. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/[category]/[productId]/index.d.ts +0 -0
  154. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  155. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/cart/index.d.ts +0 -0
  156. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/confirm/index.d.ts +0 -0
  157. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/layout.d.ts +0 -0
  158. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/payment/index.d.ts +0 -0
  159. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/shipping/index.d.ts +0 -0
  160. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/shipping/layout.d.ts +0 -0
  161. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/index.d.ts +0 -0
  162. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/layout.d.ts +0 -0
  163. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/[orderId]/index.d.ts +0 -0
  164. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/index.d.ts +0 -0
  165. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/layout.d.ts +0 -0
  166. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/index.d.ts +0 -0
  167. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/layout.d.ts +0 -0
  168. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  169. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/[[category]]/index.d.ts +0 -0
  170. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/index.d.ts +0 -0
  171. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/layout.d.ts +0 -0
  172. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/signup/index.d.ts +0 -0
  173. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  174. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  175. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/sort/layout.d.ts +0 -0
  176. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/layout.d.ts +0 -0
  177. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/followers/index.d.ts +0 -0
  178. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/following/index.d.ts +0 -0
  179. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/index.d.ts +0 -0
  180. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/layout.d.ts +0 -0
  181. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  182. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  183. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/index.d.ts +0 -0
  184. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/layout.d.ts +0 -0
  185. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/index.d.ts +0 -0
  186. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/layout.d.ts +0 -0
  187. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  188. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  189. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  190. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  191. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  192. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  193. /package/pkg/test/{cli/create.test.d.ts → routes/routes.test.d.ts} +0 -0
package/pkg/index.js CHANGED
@@ -1,33 +1,141 @@
1
- // src/index.ts
2
- import { default as default2 } from "@kosmojs/api-generator";
3
- import { default as default3 } from "@kosmojs/fetch-generator";
4
-
5
1
  // src/alias-plugin/index.ts
6
2
  import { glob } from "tinyglobby";
3
+
4
+ // src/paths.ts
5
+ import { join } from "node:path";
6
+
7
+ // src/defaults.ts
8
+ var defaults = {
9
+ appPrefix: "~",
10
+ srcPrefix: "@",
11
+ libPrefix: "_",
12
+ coreDir: "core",
13
+ srcDir: "src",
14
+ libDir: "lib",
15
+ configDir: "config",
16
+ apiDir: "api",
17
+ pagesDir: "pages",
18
+ entryDir: "entry",
19
+ fetchDir: "fetch"
20
+ };
21
+
22
+ // src/paths.ts
23
+ var createTsconfigPaths = (prefix) => {
24
+ return {
25
+ [`${defaults.appPrefix}/*`]: [`${prefix}/*`],
26
+ [`${defaults.srcPrefix}/*`]: [`${prefix}/${defaults.srcDir}/*`],
27
+ [`${defaults.libPrefix}/*`]: [
28
+ `${prefix}/${defaults.libDir}/${defaults.srcDir}/*`
29
+ ]
30
+ };
31
+ };
32
+ var pathResolver = ({
33
+ appRoot,
34
+ sourceFolder
35
+ }) => {
36
+ const createPath = (...a) => {
37
+ return appRoot ? join(appRoot, ...a) : join(...a);
38
+ };
39
+ const createImport = {
40
+ coreApi(...a) {
41
+ return join(defaults.appPrefix, defaults.coreDir, defaults.apiDir, ...a);
42
+ },
43
+ src(...a) {
44
+ return join(defaults.srcPrefix, sourceFolder, ...a);
45
+ },
46
+ config(...a) {
47
+ return this.src(defaults.configDir, ...a);
48
+ },
49
+ api(...a) {
50
+ return this.src(defaults.apiDir, ...a);
51
+ },
52
+ pages(...a) {
53
+ return this.src(defaults.pagesDir, ...a);
54
+ },
55
+ lib(...a) {
56
+ return join(defaults.libPrefix, sourceFolder, ...a);
57
+ },
58
+ libApi(...a) {
59
+ return this.lib(defaults.apiDir, ...a);
60
+ },
61
+ libEntry(...a) {
62
+ return this.lib(defaults.entryDir, ...a);
63
+ },
64
+ fetch(...a) {
65
+ return this.lib(defaults.fetchDir, ...a);
66
+ }
67
+ };
68
+ return {
69
+ createPath: {
70
+ coreApi(...a) {
71
+ return createPath(defaults.coreDir, defaults.apiDir, ...a);
72
+ },
73
+ src(...a) {
74
+ return createPath(defaults.srcDir, sourceFolder, ...a);
75
+ },
76
+ api(...a) {
77
+ return this.src(defaults.apiDir, ...a);
78
+ },
79
+ pages(...a) {
80
+ return this.src(defaults.pagesDir, ...a);
81
+ },
82
+ config(...a) {
83
+ return this.src(defaults.configDir, ...a);
84
+ },
85
+ entry(...a) {
86
+ return this.src(defaults.entryDir, ...a);
87
+ },
88
+ lib(...a) {
89
+ return createPath(defaults.libDir, defaults.srcDir, sourceFolder, ...a);
90
+ },
91
+ libApi(...a) {
92
+ return this.lib(defaults.apiDir, ...a);
93
+ },
94
+ libEntry(...a) {
95
+ return this.lib(defaults.entryDir, ...a);
96
+ },
97
+ libPages(...a) {
98
+ return this.lib(defaults.pagesDir, ...a);
99
+ },
100
+ fetch(...a) {
101
+ return this.lib(defaults.fetchDir, ...a);
102
+ }
103
+ },
104
+ createImport,
105
+ createImportHelper: (key, ...a) => {
106
+ return createImport[key](...a.slice(0, -1));
107
+ }
108
+ };
109
+ };
110
+
111
+ // src/alias-plugin/index.ts
7
112
  var alias_plugin_default = (appRoot, opt) => {
8
113
  return {
9
114
  name: "@kosmojs:aliasPlugin",
10
115
  async config() {
11
- const compilerOptions = await import(`${appRoot}/tsconfig.json`, {
12
- with: { type: "json" }
13
- }).then((e) => e.default.compilerOptions);
116
+ const paths = await import(`${appRoot}/tsconfig.json`, { with: { type: "json" } }).then((e) => {
117
+ return {
118
+ ...e.default.compilerOptions?.paths,
119
+ ...createTsconfigPaths(".")
120
+ };
121
+ });
14
122
  const aliasmap = [];
15
- const pathEntries = Object.entries({ ...compilerOptions?.paths });
123
+ const pathEntries = Object.entries(paths);
16
124
  for (const [aliasPattern, pathPatterns] of pathEntries) {
17
125
  const alias = aliasPattern.replace("/*", "");
18
- const paths = pathPatterns.map((e) => e.replace("/*", "")).sort((a, b) => a.split(/\/+/).length - b.split(/\/+/).length);
19
- if (paths.length === 1) {
126
+ const paths2 = pathPatterns.map((e) => e.replace("/*", "")).sort((a, b) => a.split(/\/+/).length - b.split(/\/+/).length);
127
+ if (paths2.length === 1) {
20
128
  aliasmap.push({
21
129
  find: new RegExp(`^${alias}/`),
22
- replacement: `${appRoot}/${paths[0]}/`
130
+ replacement: `${appRoot}/${paths2[0]}/`
23
131
  });
24
- } else if (paths.length > 1) {
132
+ } else if (paths2.length > 1) {
25
133
  aliasmap.push({
26
134
  find: new RegExp(`^${alias}/`),
27
135
  replacement: "",
28
136
  async customResolver(_src) {
29
137
  const src = _src.replace(/(\$|\^|\+|\(|\)|\[|\])/g, "\\$1");
30
- const patterns = paths.flatMap((path) => [
138
+ const patterns = paths2.flatMap((path) => [
31
139
  // Case 1: Extension is explicitly provided
32
140
  // e.g. import styles from "@admin/{solid}/styles.module.css"
33
141
  `${path}/${src}*`,
@@ -67,105 +175,92 @@ var alias_plugin_default = (appRoot, opt) => {
67
175
  };
68
176
 
69
177
  // src/base-plugin/index.ts
70
- import { basename, join as join3, resolve as resolve5 } from "node:path";
178
+ import { basename as basename2, join as join5, resolve as resolve5 } from "node:path";
71
179
  import { styleText as styleText2 } from "node:util";
72
180
  import { Worker } from "node:worker_threads";
73
- import apiGenerator from "@kosmojs/api-generator";
74
181
  import stubGenerator from "@kosmojs/dev/stub-generator";
75
- import fetchGenerator from "@kosmojs/fetch-generator";
76
182
 
77
- // src/base-plugin/api-handler.ts
78
- import { join, resolve } from "node:path";
79
- import { styleText } from "node:util";
80
- import { context } from "esbuild";
81
- import { defaults } from "@kosmojs/devlib";
82
- var api_handler_default = async (options) => {
83
- const { appRoot, sourceFolder, baseurl, apiurl } = options;
84
- const apiDir = join(sourceFolder, defaults.apiDir);
85
- const outDir = join(options.outDir, defaults.apiDir);
86
- const esbuildOptions = await import(resolve(appRoot, "esbuild.json"), { with: { type: "json" } }).then((e) => e.default);
87
- let app;
88
- let devMiddlewareFactory;
89
- let teardownHandler;
90
- const watcher = async () => {
91
- const rebuildPlugin = {
92
- name: "rebuild",
93
- setup(build) {
94
- build.onEnd(async () => {
95
- if (app) {
96
- await teardownHandler?.(app);
97
- }
98
- try {
99
- const exports = await import(`${outDir}/app.js?${Date.now()}`);
100
- devMiddlewareFactory = exports.devMiddlewareFactory;
101
- teardownHandler = exports.teardownHandler;
102
- app = await exports.default();
103
- console.debug(`${styleText("green", "\u279C")} Api handler ready`);
104
- } catch (error) {
105
- console.error(`${styleText("red", "\u2717")} Api handler error`);
106
- console.error(error);
107
- }
108
- });
109
- }
110
- };
111
- const ctx = await context({
112
- ...esbuildOptions,
113
- logLevel: "error",
114
- bundle: true,
115
- entryPoints: [join(apiDir, "app.ts")],
116
- plugins: [rebuildPlugin],
117
- outdir: outDir
118
- });
119
- return {
120
- async start() {
121
- await ctx.watch({
122
- // waits this many milliseconds before rebuilding after a change is detected
123
- delay: options.watcher.delay
124
- });
125
- },
126
- async stop() {
127
- await ctx.dispose();
128
- }
129
- };
130
- };
131
- const devMiddleware = async (req, res, viteHandler) => {
132
- const next = () => {
133
- return viteHandler();
134
- };
135
- if (devMiddlewareFactory) {
136
- const handler = devMiddlewareFactory(app);
137
- await handler(req, res, next);
138
- } else {
139
- !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url) ? next() : await app?.callback()(req, res);
183
+ // src/routes-factory/resolve.ts
184
+ import { dirname as dirname3, join as join3, resolve as resolve3 } from "node:path";
185
+ import crc5 from "crc/crc32";
186
+ import picomatch from "picomatch";
187
+ import { glob as glob2 } from "tinyglobby";
188
+
189
+ // src/render.ts
190
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
191
+ import { dirname, join as join2 } from "node:path";
192
+ import crc from "crc/crc32";
193
+ import handlebars from "handlebars";
194
+
195
+ // src/fs.ts
196
+ import { access, constants } from "node:fs/promises";
197
+ var pathExists = async (path) => {
198
+ try {
199
+ await access(path, constants.F_OK);
200
+ return true;
201
+ } catch {
202
+ return false;
203
+ }
204
+ };
205
+
206
+ // src/render.ts
207
+ var render = (template, context2, options) => {
208
+ const { noEscape = true, renderer = handlebars } = { ...options };
209
+ return renderer.compile(template, { noEscape })(context2);
210
+ };
211
+ var renderAsFile = (file, template, context2, options) => {
212
+ const { formatters, ...renderOpts } = { ...options };
213
+ const content = render(template, context2, renderOpts);
214
+ return Array.isArray(formatters) ? formatters.reduce((c, f) => f(c, file), content) : content;
215
+ };
216
+ var renderToFile = async (file, template, context2, options) => {
217
+ const content = renderAsFile(file, template, context2, options);
218
+ if (await pathExists(file)) {
219
+ const { overwrite = true } = { ...options };
220
+ if (overwrite === false) {
221
+ return;
140
222
  }
141
- };
223
+ const fileContent = await readFile(file, "utf8");
224
+ if (typeof overwrite === "function" && !overwrite(fileContent)) {
225
+ return;
226
+ }
227
+ if (crc(content) === crc(fileContent)) {
228
+ return;
229
+ }
230
+ }
231
+ await mkdir(dirname(file), { recursive: true });
232
+ await writeFile(file, content, "utf8");
233
+ };
234
+ var renderFactory = (options) => {
235
+ const renderer = handlebars.create();
236
+ if (options?.partials) {
237
+ renderer.registerPartial(options.partials);
238
+ }
239
+ if (options?.helpers) {
240
+ renderer.registerHelper(options.helpers);
241
+ }
142
242
  return {
143
- watcher,
144
- devMiddleware
243
+ render(template, context2, selfOoptions) {
244
+ return render(template, context2, {
245
+ renderer,
246
+ ...options,
247
+ ...selfOoptions
248
+ });
249
+ },
250
+ async renderToFile(file, template, context2, selfOoptions) {
251
+ return renderToFile(
252
+ options?.outdir ? join2(options.outdir, file) : file,
253
+ template,
254
+ context2,
255
+ { renderer, ...options, ...selfOoptions }
256
+ );
257
+ }
145
258
  };
146
259
  };
147
260
 
148
- // src/base-plugin/routes.ts
149
- import {
150
- defaults as defaults3
151
- } from "@kosmojs/devlib";
152
-
153
- // src/base-plugin/routes/resolve.ts
154
- import { dirname as dirname2, join as join2, resolve as resolve4 } from "node:path";
155
- import crc3 from "crc/crc32";
156
- import picomatch from "picomatch";
157
- import { glob as glob2 } from "tinyglobby";
158
- import {
159
- defaults as defaults2,
160
- pathResolver as pathResolver2,
161
- pathTokensFactory,
162
- render,
163
- renderToFile
164
- } from "@kosmojs/devlib";
165
-
166
- // src/base-plugin/ast.ts
167
- import { resolve as resolve2 } from "node:path";
168
- import crc from "crc/crc32";
261
+ // src/ast.ts
262
+ import { resolve } from "node:path";
263
+ import crc2 from "crc/crc32";
169
264
  import { flattener } from "tfusion";
170
265
  import {
171
266
  Project,
@@ -252,14 +347,14 @@ var extractRouteMethods = (callExpression, route) => {
252
347
  const payloadText = payloadGeneric?.node ? payloadGeneric.node.getChildren().length === 0 ? "{}" : payloadGeneric.node.getFullText() : void 0;
253
348
  const responseText = responseGeneric?.node.getText();
254
349
  const responseType = responseText ? {
255
- id: ["ResponseT", crc(route.importName + method)].join(""),
350
+ id: ["ResponseT", crc2(route.id + method)].join(""),
256
351
  method,
257
352
  skipValidation: responseGeneric?.comments ? responseGeneric.comments.some(skipValidationFilter) : false,
258
353
  text: ["never", "object"].includes(responseText) ? "{}" : responseText,
259
354
  resolvedType: void 0
260
355
  } : void 0;
261
356
  const payloadType = payloadText ? {
262
- id: ["PayloadT", crc(route.importName + method)].join(""),
357
+ id: ["PayloadT", crc2(route.id + method)].join(""),
263
358
  responseTypeId: responseType?.id,
264
359
  method,
265
360
  skipValidation: payloadGeneric?.comments ? payloadGeneric.comments.some(skipValidationFilter) : false,
@@ -388,12 +483,12 @@ var extractGenerics = (callExpression) => {
388
483
  };
389
484
  var typeResolverFactory = ({ appRoot }) => {
390
485
  const project = createProject({
391
- tsConfigFilePath: resolve2(appRoot, "tsconfig.json"),
486
+ tsConfigFilePath: resolve(appRoot, "tsconfig.json"),
392
487
  skipAddingFilesFromTsConfig: true
393
488
  });
394
489
  const literalTypesResolver = (literalTypes, options) => {
395
490
  const sourceFile = project.createSourceFile(
396
- `${crc(literalTypes)}-${Date.now()}.ts`,
491
+ `${crc2(literalTypes)}-${Date.now()}.ts`,
397
492
  literalTypes,
398
493
  { overwrite: true }
399
494
  );
@@ -418,12 +513,11 @@ var typeResolverFactory = ({ appRoot }) => {
418
513
  };
419
514
  };
420
515
 
421
- // src/base-plugin/cache.ts
422
- import { mkdir, readFile, writeFile } from "node:fs/promises";
423
- import { dirname, resolve as resolve3 } from "node:path";
424
- import crc2 from "crc/crc32";
516
+ // src/cache.ts
517
+ import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
518
+ import { dirname as dirname2, resolve as resolve2 } from "node:path";
519
+ import crc3 from "crc/crc32";
425
520
  import self from "@kosmojs/dev/package.json" with { type: "json" };
426
- import { pathExists, pathResolver } from "@kosmojs/devlib";
427
521
  var cacheFactory = (route, {
428
522
  appRoot,
429
523
  sourceFolder,
@@ -432,11 +526,11 @@ var cacheFactory = (route, {
432
526
  const cacheFile = pathResolver({
433
527
  appRoot,
434
528
  sourceFolder
435
- }).resolve("apiLibDir", dirname(route.file), "cache.json");
529
+ }).createPath.libApi(dirname2(route.file), "cache.json");
436
530
  const getCache = async (opt) => {
437
531
  if (await pathExists(cacheFile)) {
438
532
  try {
439
- const cache = JSON.parse(await readFile(cacheFile, "utf8"));
533
+ const cache = JSON.parse(await readFile2(cacheFile, "utf8"));
440
534
  return opt?.validate ? validateCache(cache) : cache;
441
535
  } catch (_e) {
442
536
  }
@@ -459,8 +553,8 @@ var cacheFactory = (route, {
459
553
  ] = await generateFileHash(file);
460
554
  }
461
555
  const cache = { ...rest, hash, referencedFiles };
462
- await mkdir(dirname(cacheFile), { recursive: true });
463
- await writeFile(cacheFile, JSON.stringify(cache, null, 2), "utf8");
556
+ await mkdir2(dirname2(cacheFile), { recursive: true });
557
+ await writeFile2(cacheFile, JSON.stringify(cache, null, 2), "utf8");
464
558
  return cache;
465
559
  };
466
560
  const validateCache = async (cache) => {
@@ -477,7 +571,7 @@ var cacheFactory = (route, {
477
571
  return;
478
572
  }
479
573
  for (const [file, hash2] of Object.entries(cache.referencedFiles)) {
480
- if (!identicalHashSum(hash2, await generateFileHash(resolve3(appRoot, file)))) {
574
+ if (!identicalHashSum(hash2, await generateFileHash(resolve2(appRoot, file)))) {
481
575
  return;
482
576
  }
483
577
  }
@@ -492,11 +586,11 @@ var cacheFactory = (route, {
492
586
  var generateFileHash = async (file, extraContext) => {
493
587
  let fileContent;
494
588
  try {
495
- fileContent = await readFile(file, "utf8");
589
+ fileContent = await readFile2(file, "utf8");
496
590
  } catch (_e) {
497
591
  return 0;
498
592
  }
499
- return fileContent ? crc2(
593
+ return fileContent ? crc3(
500
594
  JSON.stringify({
501
595
  ...extraContext,
502
596
  [self.cacheVersion]: fileContent
@@ -507,13 +601,77 @@ var identicalHashSum = (a, b) => {
507
601
  return a === b;
508
602
  };
509
603
 
510
- // src/base-plugin/templates/resolved-types.hbs
604
+ // src/routes-factory/base.ts
605
+ import crc4 from "crc/crc32";
606
+ var pathTokensFactory = (path) => {
607
+ const requiredParamRegex = /^\[([^\]]+)\]$/;
608
+ const optionalParamRegex = /^\[\[([^\]]+)\]\]$/;
609
+ const restParamRegex = /^\[\.\.\.([^\]]+)\]$/;
610
+ return path.split("/").map((orig, i) => {
611
+ const [base, ext = ""] = orig.split(/(\.([\w\d-]+)$)/);
612
+ const paramBase = (regex) => {
613
+ const name = base.replace(regex, "$1") || base;
614
+ return {
615
+ name,
616
+ const: /\W/.test(name) ? [name.replace(/\W/g, "_"), crc4(orig)].join("_") : name
617
+ };
618
+ };
619
+ let param;
620
+ if (base.startsWith("[")) {
621
+ if (restParamRegex.test(base)) {
622
+ param = {
623
+ ...paramBase(restParamRegex),
624
+ isRequired: false,
625
+ isOptional: false,
626
+ isRest: true
627
+ };
628
+ } else if (optionalParamRegex.test(base)) {
629
+ param = {
630
+ ...paramBase(optionalParamRegex),
631
+ isRequired: false,
632
+ isOptional: true,
633
+ isRest: false
634
+ };
635
+ } else if (requiredParamRegex.test(base)) {
636
+ param = {
637
+ ...paramBase(requiredParamRegex),
638
+ isRequired: true,
639
+ isOptional: false,
640
+ isRest: false
641
+ };
642
+ }
643
+ }
644
+ return {
645
+ orig,
646
+ base,
647
+ path: i === 0 ? orig.replace(/^index$/, "/") : orig,
648
+ ext,
649
+ ...param ? { param } : {}
650
+ };
651
+ });
652
+ };
653
+ var sortRoutes = (a, b) => {
654
+ const aStaticSegments = staticSegments(a.pathTokens);
655
+ const bStaticSegments = staticSegments(b.pathTokens);
656
+ if (aStaticSegments !== bStaticSegments) {
657
+ return bStaticSegments - aStaticSegments;
658
+ }
659
+ if (a.pathTokens.length !== b.pathTokens.length) {
660
+ return a.pathTokens.length - b.pathTokens.length;
661
+ }
662
+ return a.name.localeCompare(b.name);
663
+ };
664
+ var staticSegments = (pathTokens) => {
665
+ return pathTokens.reduce((a, e) => a + (e.param ? 0 : 1), 0);
666
+ };
667
+
668
+ // src/routes-factory/templates/resolved-types.hbs
511
669
  var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n";
512
670
 
513
- // src/base-plugin/templates/types.hbs
671
+ // src/routes-factory/templates/types.hbs
514
672
  var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
515
673
 
516
- // src/base-plugin/routes/resolve.ts
674
+ // src/routes-factory/resolve.ts
517
675
  var API_INDEX_BASENAME = "index";
518
676
  var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
519
677
  var API_USE_BASENAME = "use";
@@ -524,29 +682,30 @@ var PAGE_LAYOUT_BASENAME = "layout";
524
682
  var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
525
683
  var ROUTE_FILE_PATTERNS = [
526
684
  // match index files in api dir
527
- `${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
685
+ `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
528
686
  // match use files in api dir
529
- `${defaults2.apiDir}/**/${API_USE_PATTERN}`,
687
+ `${defaults.apiDir}/**/${API_USE_PATTERN}`,
530
688
  // match index files in pages dir
531
- `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
689
+ `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
532
690
  // match layout files in pages dir
533
- `${defaults2.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
691
+ `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
534
692
  ];
535
693
  var scanRoutes = async ({
536
694
  appRoot,
537
695
  sourceFolder
538
696
  }) => {
697
+ const { createPath } = pathResolver({ appRoot, sourceFolder });
539
698
  return glob2(ROUTE_FILE_PATTERNS, {
540
- cwd: resolve4(appRoot, sourceFolder),
699
+ cwd: createPath.src(),
541
700
  absolute: true,
542
701
  onlyFiles: true,
543
702
  followSymbolicLinks: false,
544
703
  ignore: [
545
704
  // ignore top-level matches, routes resides in folders, even index route
546
- `${defaults2.apiDir}/${API_INDEX_PATTERN}`,
547
- `${defaults2.apiDir}/${API_USE_PATTERN}`,
548
- `${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`,
549
- `${defaults2.pagesDir}/${PAGE_LAYOUT_PATTERN}`
705
+ `${defaults.apiDir}/${API_INDEX_PATTERN}`,
706
+ `${defaults.apiDir}/${API_USE_PATTERN}`,
707
+ `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
708
+ `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
550
709
  ]
551
710
  });
552
711
  };
@@ -554,11 +713,11 @@ var isRouteFile = (file, {
554
713
  appRoot,
555
714
  sourceFolder
556
715
  }) => {
557
- const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
716
+ const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/${defaults.srcDir}/`, "").split("/");
558
717
  if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
559
- return;
718
+ return false;
560
719
  }
561
- return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
720
+ return picomatch.isMatch(join3(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : false;
562
721
  };
563
722
  var isApiRoute = (file) => {
564
723
  return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
@@ -572,28 +731,23 @@ var isPageRoute = (file) => {
572
731
  var isPageLayout = (file) => {
573
732
  return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
574
733
  };
575
- var createRouteEntry = (_file, {
734
+ var createRouteEntry = (fileFullpath, {
576
735
  appRoot,
577
736
  sourceFolder
578
737
  }) => {
579
- const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
738
+ const resolvedPaths = isRouteFile(fileFullpath, { appRoot, sourceFolder });
580
739
  if (!resolvedPaths) {
581
740
  return;
582
741
  }
583
742
  const [folder, file] = resolvedPaths;
584
- const fileFullpath = join2(appRoot, sourceFolder, folder, file);
585
- const pathTokens = pathTokensFactory(dirname2(file));
586
- const name = pathTokens.map((e) => e.orig).join("/");
587
- const importFile = file;
588
- const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
743
+ const pathTokens = pathTokensFactory(dirname3(file));
589
744
  return {
590
- name,
745
+ id: `${file.replace(/\W+/g, "_")}_${crc5(file)}`,
746
+ name: pathTokens.map((e) => e.orig).join("/"),
591
747
  folder,
592
748
  file,
593
749
  fileFullpath,
594
- pathTokens,
595
- importFile,
596
- importName
750
+ pathTokens
597
751
  };
598
752
  };
599
753
  var pageLayoutResolverFactory = () => {
@@ -610,17 +764,10 @@ var pageLayoutResolverFactory = () => {
610
764
  };
611
765
  var pageRouteResolverFactory = () => {
612
766
  return (entry) => {
613
- const {
614
- name,
615
- folder,
616
- file,
617
- fileFullpath,
618
- pathTokens,
619
- importFile,
620
- importName
621
- } = entry;
767
+ const { id, name, folder, file, fileFullpath, pathTokens } = entry;
622
768
  const handler = async () => {
623
769
  const entry2 = {
770
+ id,
624
771
  name,
625
772
  pathTokens,
626
773
  params: {
@@ -628,9 +775,7 @@ var pageRouteResolverFactory = () => {
628
775
  },
629
776
  folder,
630
777
  file,
631
- fileFullpath,
632
- importFile,
633
- importName
778
+ fileFullpath
634
779
  };
635
780
  return {
636
781
  kind: "pageRoute",
@@ -673,22 +818,14 @@ var apiRouteResolverFactory = (pluginOptions) => {
673
818
  refreshSourceFile
674
819
  } = typeResolverFactory(pluginOptions);
675
820
  return (entry) => {
676
- const {
677
- name,
678
- file,
679
- folder,
680
- fileFullpath,
681
- pathTokens,
682
- importFile,
683
- importName
684
- } = entry;
821
+ const { id, name, file, folder, fileFullpath, pathTokens } = entry;
685
822
  const handler = async (updatedFile) => {
686
823
  const paramsSchema = pathTokens.flatMap((e) => {
687
824
  return e.param ? [e.param] : [];
688
825
  });
689
826
  const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
690
827
  const { getCache, persistCache } = cacheFactory(
691
- { file, fileFullpath, importName },
828
+ { id, file, fileFullpath },
692
829
  {
693
830
  appRoot,
694
831
  sourceFolder,
@@ -708,12 +845,12 @@ var apiRouteResolverFactory = (pluginOptions) => {
708
845
  responseTypes,
709
846
  referencedFiles = []
710
847
  } = await resolveRouteSignature(
711
- { importName, fileFullpath, optionalParams },
848
+ { id, fileFullpath, optionalParams },
712
849
  {
713
850
  withReferencedFiles: true,
714
851
  sourceFile: getSourceFile(fileFullpath),
715
852
  relpathResolver(path) {
716
- return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
853
+ return join3(sourceFolder, defaults.apiDir, dirname3(file), path);
717
854
  }
718
855
  }
719
856
  );
@@ -724,13 +861,12 @@ var apiRouteResolverFactory = (pluginOptions) => {
724
861
  }
725
862
  return [];
726
863
  }) : [];
727
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
728
- "apiLibDir",
729
- dirname2(file),
730
- "types.ts"
731
- );
864
+ const typesFile = pathResolver({
865
+ appRoot,
866
+ sourceFolder
867
+ }).createPath.libApi(dirname3(file), "types.ts");
732
868
  const params = {
733
- id: ["ParamsT", crc3(name)].join(""),
869
+ id: ["ParamsT", crc5(name)].join(""),
734
870
  schema: paramsSchema,
735
871
  resolvedType: void 0
736
872
  };
@@ -748,9 +884,9 @@ var apiRouteResolverFactory = (pluginOptions) => {
748
884
  });
749
885
  const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
750
886
  overrides: [...payloadTypes, ...responseTypes].reduce(
751
- (map, { id, skipValidation }) => {
887
+ (map, { id: id2, skipValidation }) => {
752
888
  if (skipValidation) {
753
- map[id] = "never";
889
+ map[id2] = "never";
754
890
  }
755
891
  return map;
756
892
  },
@@ -787,13 +923,12 @@ var apiRouteResolverFactory = (pluginOptions) => {
787
923
  });
788
924
  }
789
925
  const entry2 = {
926
+ id,
790
927
  name,
791
928
  pathTokens,
792
929
  params: cache.params,
793
930
  numericParams: cache.numericParams,
794
931
  optionalParams,
795
- importName,
796
- importFile,
797
932
  folder,
798
933
  file,
799
934
  fileFullpath,
@@ -804,7 +939,7 @@ var apiRouteResolverFactory = (pluginOptions) => {
804
939
  referencedFiles: Object.keys(cache.referencedFiles).map(
805
940
  // expand referenced files path,
806
941
  // they are stored as relative in cache
807
- (e) => resolve4(appRoot, e)
942
+ (e) => resolve3(appRoot, e)
808
943
  )
809
944
  };
810
945
  return {
@@ -816,13 +951,93 @@ var apiRouteResolverFactory = (pluginOptions) => {
816
951
  };
817
952
  };
818
953
 
819
- // src/base-plugin/routes/nesting.ts
820
- import {
821
- sortRoutes
822
- } from "@kosmojs/devlib";
954
+ // src/routes-factory/nesting.ts
955
+ import { basename } from "node:path";
956
+ var nestedRoutesFactory = (routeEntries) => {
957
+ const entryStack = structuredClone(routeEntries).sort(sortRoutes);
958
+ const transformEntries = (entries, parent) => {
959
+ return [...new Set(entries.map((e) => e.name))].flatMap((name) => {
960
+ const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {
961
+ return entry.name === name ? [entry] : [];
962
+ });
963
+ const index = nameEntries.find(
964
+ (e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME)
965
+ );
966
+ const layout = nameEntries.find(
967
+ (e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME)
968
+ );
969
+ if (index || layout) {
970
+ return [
971
+ {
972
+ index: index ? {
973
+ ...index,
974
+ pathTokens: index.pathTokens.slice(
975
+ parent?.pathTokens.length || 0
976
+ )
977
+ } : void 0,
978
+ layout: layout ? {
979
+ ...layout,
980
+ pathTokens: layout.pathTokens.slice(
981
+ parent?.pathTokens.length || 0
982
+ )
983
+ } : void 0,
984
+ parent: parent?.name,
985
+ children: transformEntries(
986
+ findDescendantEntries(index || layout),
987
+ index || layout
988
+ )
989
+ }
990
+ ];
991
+ }
992
+ return [];
993
+ });
994
+ };
995
+ const findDescendantEntries = ({
996
+ name,
997
+ pathTokens
998
+ }) => {
999
+ const potentialChildren = entryStack.filter((entry) => {
1000
+ if (entry.pathTokens.length <= pathTokens.length) {
1001
+ return false;
1002
+ }
1003
+ if (!entry.name.startsWith(`${name}/`)) {
1004
+ return false;
1005
+ }
1006
+ return true;
1007
+ });
1008
+ return potentialChildren.filter((child) => {
1009
+ const hasIntermediateRoute = potentialChildren.some((intermediate) => {
1010
+ if (intermediate === child) {
1011
+ return false;
1012
+ }
1013
+ if (intermediate.pathTokens.length <= pathTokens.length) {
1014
+ return false;
1015
+ }
1016
+ if (intermediate.pathTokens.length >= child.pathTokens.length) {
1017
+ return false;
1018
+ }
1019
+ return child.name.startsWith(`${intermediate.name}/`);
1020
+ });
1021
+ return !hasIntermediateRoute;
1022
+ });
1023
+ };
1024
+ const rootEntries = entryStack.filter((entry) => {
1025
+ const hasParent = entryStack.some((potential) => {
1026
+ if (potential === entry) {
1027
+ return false;
1028
+ }
1029
+ if (potential.pathTokens.length >= entry.pathTokens.length) {
1030
+ return false;
1031
+ }
1032
+ return entry.name.startsWith(`${potential.name}/`);
1033
+ });
1034
+ return !hasParent;
1035
+ });
1036
+ return transformEntries(rootEntries);
1037
+ };
823
1038
 
824
- // src/base-plugin/routes.ts
825
- var routes_default = async (pluginOptions) => {
1039
+ // src/routes-factory/index.ts
1040
+ var routesFactory = async (pluginOptions) => {
826
1041
  const { appRoot, sourceFolder } = pluginOptions;
827
1042
  const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
828
1043
  const apiUseResolver = apiUseResolverFactory(pluginOptions);
@@ -835,13 +1050,13 @@ var routes_default = async (pluginOptions) => {
835
1050
  return entry ? [entry] : [];
836
1051
  });
837
1052
  for (const entry of entries) {
838
- if (entry.folder === defaults3.apiDir) {
1053
+ if (entry.folder === defaults.apiDir) {
839
1054
  if (isApiRoute(entry.file)) {
840
1055
  resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
841
1056
  } else if (isApiUse(entry.file)) {
842
1057
  resolvers.set(entry.fileFullpath, apiUseResolver(entry));
843
1058
  }
844
- } else if (entry.folder === defaults3.pagesDir) {
1059
+ } else if (entry.folder === defaults.pagesDir) {
845
1060
  if (isPageRoute(entry.file)) {
846
1061
  resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
847
1062
  } else if (isPageLayout(entry.file)) {
@@ -858,6 +1073,76 @@ var routes_default = async (pluginOptions) => {
858
1073
  };
859
1074
  };
860
1075
 
1076
+ // src/base-plugin/api-handler.ts
1077
+ import { join as join4, resolve as resolve4 } from "node:path";
1078
+ import { styleText } from "node:util";
1079
+ import { context } from "esbuild";
1080
+ var api_handler_default = async (options) => {
1081
+ const { appRoot, sourceFolder, baseurl, apiurl } = options;
1082
+ const { createPath } = pathResolver({ appRoot, sourceFolder });
1083
+ const outDir = join4(options.outDir, defaults.apiDir);
1084
+ const esbuildOptions = await import(resolve4(appRoot, "esbuild.json"), { with: { type: "json" } }).then((e) => e.default);
1085
+ let app;
1086
+ let devMiddlewareFactory;
1087
+ let teardownHandler;
1088
+ const watcher = async () => {
1089
+ const rebuildPlugin = {
1090
+ name: "rebuild",
1091
+ setup(build) {
1092
+ build.onEnd(async () => {
1093
+ if (app) {
1094
+ await teardownHandler?.(app);
1095
+ }
1096
+ try {
1097
+ const exports = await import(`${outDir}/app.js?${Date.now()}`);
1098
+ devMiddlewareFactory = exports.devMiddlewareFactory;
1099
+ teardownHandler = exports.teardownHandler;
1100
+ app = await exports.default();
1101
+ console.debug(`${styleText("green", "\u279C")} Api handler ready`);
1102
+ } catch (error) {
1103
+ console.error(`${styleText("red", "\u2717")} Api handler error`);
1104
+ console.error(error);
1105
+ }
1106
+ });
1107
+ }
1108
+ };
1109
+ const ctx = await context({
1110
+ ...esbuildOptions,
1111
+ logLevel: "error",
1112
+ bundle: true,
1113
+ entryPoints: [createPath.api("app.ts")],
1114
+ plugins: [rebuildPlugin],
1115
+ outdir: outDir
1116
+ });
1117
+ return {
1118
+ async start() {
1119
+ await ctx.watch({
1120
+ // waits this many milliseconds before rebuilding after a change is detected
1121
+ delay: options.watcher.delay
1122
+ });
1123
+ },
1124
+ async stop() {
1125
+ await ctx.dispose();
1126
+ }
1127
+ };
1128
+ };
1129
+ const devMiddleware = async (req, res, viteHandler) => {
1130
+ const next = () => {
1131
+ return viteHandler();
1132
+ };
1133
+ if (devMiddlewareFactory) {
1134
+ const handler = devMiddlewareFactory(app);
1135
+ await handler(req, res, next);
1136
+ } else {
1137
+ !req?.url || !new RegExp(`^${join4(baseurl, apiurl)}($|/)`).test(req.url) ? next() : await app?.callback()(req, res);
1138
+ }
1139
+ };
1140
+ return {
1141
+ watcher,
1142
+ devMiddleware
1143
+ };
1144
+ };
1145
+
861
1146
  // src/base-plugin/spinner.ts
862
1147
  import ora from "ora";
863
1148
  var spinnerFactory = (startText) => {
@@ -974,15 +1259,15 @@ var base_plugin_default = (apiurl, pluginOptions) => {
974
1259
  }
975
1260
  return {
976
1261
  build: {
977
- outDir: join3(config.build.outDir, outDirSuffix),
1262
+ outDir: join5(config.build.outDir, outDirSuffix),
978
1263
  manifest: true
979
1264
  }
980
1265
  };
981
1266
  },
982
1267
  async configResolved(_config) {
983
1268
  store.config = _config;
984
- const appRoot = resolve5(store.config.root, "..");
985
- const sourceFolder = basename(store.config.root);
1269
+ const appRoot = resolve5(store.config.root, "../..");
1270
+ const sourceFolder = basename2(store.config.root);
986
1271
  const outDir = resolve5(appRoot, resolve5(store.config.build.outDir, ".."));
987
1272
  const { stabilityThreshold = 1e3 } = typeof store.config.server.watch?.awaitWriteFinish === "object" ? store.config.server.watch.awaitWriteFinish : {};
988
1273
  const watcher = {
@@ -995,9 +1280,14 @@ var base_plugin_default = (apiurl, pluginOptions) => {
995
1280
  formatters = [],
996
1281
  refineTypeName = "TRefine"
997
1282
  } = { ...pluginOptions };
998
- const _apiGenerator = generators.find((e) => e.kind === "api");
999
- const _fetchGenerator = generators.find((e) => e.kind === "fetch");
1000
- const _ssrGenerator = generators.find((e) => e.kind === "ssr");
1283
+ const apiGenerator = generators.find((e) => e.kind === "api");
1284
+ const fetchGenerator = generators.find((e) => e.kind === "fetch");
1285
+ const ssrGenerator = generators.find((e) => e.kind === "ssr");
1286
+ if (!apiGenerator || !fetchGenerator) {
1287
+ throw new Error(
1288
+ "Some of required generators missing, make sure both `api` and `fetch` generators configured properly"
1289
+ );
1290
+ }
1001
1291
  store.resolvedOptions = {
1002
1292
  ...pluginOptions,
1003
1293
  command: store.config.command,
@@ -1006,15 +1296,15 @@ var base_plugin_default = (apiurl, pluginOptions) => {
1006
1296
  // 1. stub generator should run first
1007
1297
  stubGenerator(),
1008
1298
  // 2. then api generator
1009
- _apiGenerator || apiGenerator(),
1299
+ apiGenerator,
1010
1300
  // 3. then fetch generator
1011
- _fetchGenerator || fetchGenerator(),
1301
+ fetchGenerator,
1012
1302
  // 4. user generators in the order they were added
1013
1303
  ...generators.filter((e) => {
1014
1304
  return e.kind ? !["api", "fetch", "ssr"].includes(e.kind) : true;
1015
1305
  }),
1016
1306
  // 5. ssr generator should run last
1017
- ..._ssrGenerator ? [_ssrGenerator] : []
1307
+ ...ssrGenerator ? [ssrGenerator] : []
1018
1308
  ],
1019
1309
  formatters: formatters.map((e) => e.formatter),
1020
1310
  refineTypeName,
@@ -1026,7 +1316,7 @@ var base_plugin_default = (apiurl, pluginOptions) => {
1026
1316
  };
1027
1317
  }
1028
1318
  if (store.config.command === "build") {
1029
- const { resolvers } = await routes_default(store.resolvedOptions);
1319
+ const { resolvers } = await routesFactory(store.resolvedOptions);
1030
1320
  const resolvedEntries = [];
1031
1321
  {
1032
1322
  const spinner = spinnerFactory("Resolving Routes");
@@ -1042,8 +1332,8 @@ var base_plugin_default = (apiurl, pluginOptions) => {
1042
1332
  const spinner = spinnerFactory("Running Generators");
1043
1333
  for (const { name, factory } of store.resolvedOptions.generators) {
1044
1334
  spinner.append(name);
1045
- const { watchHandler } = await factory(store.resolvedOptions);
1046
- await watchHandler(resolvedEntries);
1335
+ const { build } = await factory(store.resolvedOptions);
1336
+ await build(resolvedEntries);
1047
1337
  }
1048
1338
  spinner.succeed();
1049
1339
  }
@@ -1070,9 +1360,8 @@ var base_plugin_default = (apiurl, pluginOptions) => {
1070
1360
  };
1071
1361
 
1072
1362
  // src/define-plugin/index.ts
1073
- import { readFile as readFile2 } from "node:fs/promises";
1363
+ import { readFile as readFile3 } from "node:fs/promises";
1074
1364
  import { parse as dotenv } from "dotenv";
1075
- import { pathExists as pathExists2 } from "@kosmojs/devlib";
1076
1365
  var define_plugin_default = (entries) => {
1077
1366
  return {
1078
1367
  name: "@kosmojs:definePlugin",
@@ -1080,8 +1369,8 @@ var define_plugin_default = (entries) => {
1080
1369
  const define = {};
1081
1370
  for (const { keys, file, defineOn = "process.env", use } of entries) {
1082
1371
  define[defineOn] = {};
1083
- const fileExists = file ? await pathExists2(file) : false;
1084
- const env = fileExists ? dotenv(await readFile2(file, "utf8")) : process.env;
1372
+ const fileExists = file ? await pathExists(file) : false;
1373
+ const env = fileExists ? dotenv(await readFile3(file, "utf8")) : process.env;
1085
1374
  for (const [key, val] of Object.entries(env)) {
1086
1375
  if (keys.includes(key)) {
1087
1376
  define[`${defineOn}.${key}`] = JSON.stringify(val);
@@ -1093,11 +1382,56 @@ var define_plugin_default = (entries) => {
1093
1382
  }
1094
1383
  };
1095
1384
  };
1385
+
1386
+ // src/typebox.ts
1387
+ var typeboxLiteralText = (text, options) => {
1388
+ return [
1389
+ // Escape backticks for safe use in template literals
1390
+ [/(?<!\\)`/g, "\\`"],
1391
+ // Escape $ for safe use in template literals
1392
+ [/(?<!\\)\$\{/g, "\\${"],
1393
+ /**
1394
+ * TypeBox's built-in `Options` type is not configurable.
1395
+ * To allow a custom type name, exposing `refineTypeName` option,
1396
+ * defaulted to TRefine, then renaming it to `Options`.
1397
+ * */
1398
+ [new RegExp(`\\b${options.refineTypeName}\\s*<`, "g"), "Options<"]
1399
+ ].reduce((text2, [a, b]) => text2.replace(a, b), text);
1400
+ };
1096
1401
  export {
1402
+ API_INDEX_BASENAME,
1403
+ API_INDEX_PATTERN,
1404
+ API_USE_BASENAME,
1405
+ API_USE_PATTERN,
1406
+ PAGE_INDEX_BASENAME,
1407
+ PAGE_INDEX_PATTERN,
1408
+ PAGE_LAYOUT_BASENAME,
1409
+ PAGE_LAYOUT_PATTERN,
1097
1410
  alias_plugin_default as aliasPlugin,
1098
- default2 as apiGenerator,
1411
+ apiRouteResolverFactory,
1412
+ apiUseResolverFactory,
1413
+ createRouteEntry,
1414
+ createTsconfigPaths,
1099
1415
  base_plugin_default as default,
1416
+ defaults,
1100
1417
  define_plugin_default as definePlugin,
1101
- default3 as fetchGenerator
1418
+ isApiRoute,
1419
+ isApiUse,
1420
+ isPageLayout,
1421
+ isPageRoute,
1422
+ isRouteFile,
1423
+ nestedRoutesFactory,
1424
+ pageLayoutResolverFactory,
1425
+ pageRouteResolverFactory,
1426
+ pathResolver,
1427
+ pathTokensFactory,
1428
+ render,
1429
+ renderAsFile,
1430
+ renderFactory,
1431
+ renderToFile,
1432
+ routesFactory,
1433
+ scanRoutes,
1434
+ sortRoutes,
1435
+ typeboxLiteralText
1102
1436
  };
1103
1437
  //# sourceMappingURL=index.js.map