@kosmojs/dev 0.0.11 → 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 (195) hide show
  1. package/package.json +8 -41
  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 -583
  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/errors.ts +0 -18
  43. package/pkg/cli/templates/core/api/router.ts +0 -6
  44. package/pkg/cli/templates/core/api/server.ts +0 -63
  45. package/pkg/cli/templates/core/api/use.ts +0 -25
  46. package/pkg/cli/templates/vite.base.hbs +0 -44
  47. package/pkg/src/base-plugin/routes/nesting.d.ts +0 -5
  48. package/pkg/src/base-plugin/routes.d.ts +0 -9
  49. package/pkg/src/cli/base.d.ts +0 -30
  50. package/pkg/src/cli/cli.d.ts +0 -2
  51. package/pkg/src/cli/factory.d.ts +0 -12
  52. package/pkg/src/cli/index.d.ts +0 -2
  53. package/pkg/src/cli/templates/core/api/app.d.ts +0 -3
  54. package/pkg/src/cli/templates/core/api/errors.d.ts +0 -1
  55. package/pkg/src/cli/templates/core/api/router.d.ts +0 -3
  56. package/pkg/src/cli/templates/core/api/server.d.ts +0 -3
  57. package/pkg/src/cli/templates/core/api/use.d.ts +0 -2
  58. package/pkg/test/setup.d.ts +0 -1
  59. /package/pkg/test/@fixtures/app/{@src → src/test}/api/articles/[...path]/index.d.ts +0 -0
  60. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/[category]/[[author]]/index.d.ts +0 -0
  61. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/[category]/index.d.ts +0 -0
  62. /package/pkg/test/@fixtures/app/{@src → src/test}/api/books/index.d.ts +0 -0
  63. /package/pkg/test/@fixtures/app/{@src → src/test}/api/files/[[folder]]/[[id]].json/index.d.ts +0 -0
  64. /package/pkg/test/@fixtures/app/{@src → src/test}/api/files/[[folder]]/index.d.ts +0 -0
  65. /package/pkg/test/@fixtures/app/{@src → src/test}/api/index/index.d.ts +0 -0
  66. /package/pkg/test/@fixtures/app/{@src → src/test}/api/pages/[...path].html/index.d.ts +0 -0
  67. /package/pkg/test/@fixtures/app/{@src → src/test}/api/users/[id].json/index.d.ts +0 -0
  68. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/careers/[jobId]/index.d.ts +0 -0
  69. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/careers/layout.d.ts +0 -0
  70. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/index.d.ts +0 -0
  71. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/layout.d.ts +0 -0
  72. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/about/team/index.d.ts +0 -0
  73. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/account/layout.d.ts +0 -0
  74. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/account/profile/index.d.ts +0 -0
  75. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/index.d.ts +0 -0
  76. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  77. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  78. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  79. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/index.d.ts +0 -0
  80. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  81. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  82. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/index.d.ts +0 -0
  83. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  84. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  85. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  86. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/index.d.ts +0 -0
  87. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/[tenant]/users/layout.d.ts +0 -0
  88. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/index.d.ts +0 -0
  89. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/admin/layout.d.ts +0 -0
  90. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  91. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/[[category]]/index.d.ts +0 -0
  92. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/index.d.ts +0 -0
  93. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/layout.d.ts +0 -0
  94. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/post/[slug]/index.d.ts +0 -0
  95. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/blog/post/[slug]/layout.d.ts +0 -0
  96. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/contact/index.d.ts +0 -0
  97. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/contact/layout.d.ts +0 -0
  98. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/courses/[courseId]/layout.d.ts +0 -0
  99. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  100. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/[view]/index.d.ts +0 -0
  101. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/analytics/index.d.ts +0 -0
  102. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/index.d.ts +0 -0
  103. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/layout.d.ts +0 -0
  104. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/billing/index.d.ts +0 -0
  105. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/index.d.ts +0 -0
  106. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/layout.d.ts +0 -0
  107. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/notifications/index.d.ts +0 -0
  108. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/profile/index.d.ts +0 -0
  109. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/security/index.d.ts +0 -0
  110. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/dashboard/settings/security/layout.d.ts +0 -0
  111. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/[...path]/index.d.ts +0 -0
  112. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/index.d.ts +0 -0
  113. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/docs/layout.d.ts +0 -0
  114. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/files/[...filePath]/index.d.ts +0 -0
  115. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/files/[...filePath]/layout.d.ts +0 -0
  116. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/layout.d.ts +0 -0
  117. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/privacy/index.d.ts +0 -0
  118. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/legal/terms/index.d.ts +0 -0
  119. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  120. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/news/[category]/layout.d.ts +0 -0
  121. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/layout.d.ts +0 -0
  122. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  123. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  124. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  125. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  126. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/portal/layout.d.ts +0 -0
  127. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/products/[id]/index.d.ts +0 -0
  128. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/products/index.d.ts +0 -0
  129. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/layout.d.ts +0 -0
  130. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  131. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  132. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  133. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/index.d.ts +0 -0
  134. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/files/layout.d.ts +0 -0
  135. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/index.d.ts +0 -0
  136. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/layout.d.ts +0 -0
  137. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  138. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  139. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  140. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  141. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  142. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  143. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  144. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  145. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/index.d.ts +0 -0
  146. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/[projectId]/team/layout.d.ts +0 -0
  147. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/index.d.ts +0 -0
  148. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/projects/layout.d.ts +0 -0
  149. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  150. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/filters/index.d.ts +0 -0
  151. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/properties/layout.d.ts +0 -0
  152. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  153. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/[[query]]/layout.d.ts +0 -0
  154. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/search/index.d.ts +0 -0
  155. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/[category]/[productId]/index.d.ts +0 -0
  156. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  157. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/cart/index.d.ts +0 -0
  158. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/confirm/index.d.ts +0 -0
  159. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/layout.d.ts +0 -0
  160. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/payment/index.d.ts +0 -0
  161. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/shipping/index.d.ts +0 -0
  162. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/checkout/shipping/layout.d.ts +0 -0
  163. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/index.d.ts +0 -0
  164. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/layout.d.ts +0 -0
  165. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/[orderId]/index.d.ts +0 -0
  166. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/index.d.ts +0 -0
  167. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/orders/layout.d.ts +0 -0
  168. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/index.d.ts +0 -0
  169. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/layout.d.ts +0 -0
  170. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  171. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/[[category]]/index.d.ts +0 -0
  172. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/index.d.ts +0 -0
  173. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/shop/products/layout.d.ts +0 -0
  174. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/signup/index.d.ts +0 -0
  175. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  176. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  177. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/[category]/sort/layout.d.ts +0 -0
  178. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/store/layout.d.ts +0 -0
  179. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/followers/index.d.ts +0 -0
  180. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/following/index.d.ts +0 -0
  181. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/index.d.ts +0 -0
  182. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/layout.d.ts +0 -0
  183. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  184. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  185. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/index.d.ts +0 -0
  186. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/[username]/posts/layout.d.ts +0 -0
  187. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/index.d.ts +0 -0
  188. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/users/layout.d.ts +0 -0
  189. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  190. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  191. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  192. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  193. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  194. /package/pkg/test/@fixtures/app/{@src → src/test}/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  195. /package/pkg/test/{cli/create.test.d.ts → routes/routes.test.d.ts} +0 -0
@@ -1,819 +0,0 @@
1
- // src/base-plugin/routes.ts
2
- import {
3
- defaults as defaults2
4
- } from "@kosmojs/devlib";
5
-
6
- // src/base-plugin/routes/resolve.ts
7
- import { dirname as dirname2, join, resolve as resolve3 } from "node:path";
8
- import crc3 from "crc/crc32";
9
- import picomatch from "picomatch";
10
- import { glob } from "tinyglobby";
11
- import {
12
- defaults,
13
- pathResolver as pathResolver2,
14
- pathTokensFactory,
15
- render,
16
- renderToFile
17
- } from "@kosmojs/devlib";
18
-
19
- // src/base-plugin/ast.ts
20
- import { resolve } from "node:path";
21
- import crc from "crc/crc32";
22
- import { flattener } from "tfusion";
23
- import {
24
- Project,
25
- SyntaxKind
26
- } from "ts-morph";
27
- import { HTTPMethods } from "@kosmojs/api";
28
- var createProject = (opts) => new Project(opts);
29
- var resolveRouteSignature = async (route, opts) => {
30
- const {
31
- sourceFile = createProject().addSourceFileAtPath(route.fileFullpath)
32
- } = { ...opts };
33
- const [typeDeclarations, referencedFiles] = extractTypeDeclarations(
34
- sourceFile,
35
- opts
36
- );
37
- const defaultExport = extractDefaultExport(sourceFile);
38
- const paramsRefinements = defaultExport ? extractParamsRefinements(defaultExport) : void 0;
39
- const methods = defaultExport ? extractRouteMethods(defaultExport, route) : [];
40
- const payloadTypes = methods.flatMap((e) => {
41
- return e.payloadType ? [e.payloadType] : [];
42
- });
43
- const responseTypes = methods.flatMap((e) => {
44
- return e.responseType ? [e.responseType] : [];
45
- });
46
- return {
47
- typeDeclarations,
48
- paramsRefinements,
49
- methods: methods.map((e) => e.method),
50
- payloadTypes,
51
- responseTypes,
52
- referencedFiles
53
- };
54
- };
55
- var extractDefaultExport = (sourceFile) => {
56
- const [defaultExport] = sourceFile.getExportAssignments().flatMap((exportAssignment) => {
57
- if (exportAssignment.isExportEquals()) {
58
- return [];
59
- }
60
- const callExpression = exportAssignment.getExpression();
61
- return callExpression.isKind(SyntaxKind.CallExpression) ? [callExpression] : [];
62
- });
63
- return defaultExport;
64
- };
65
- var extractParamsRefinements = (callExpression) => {
66
- const [firstGeneric] = extractGenerics(callExpression);
67
- if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {
68
- return;
69
- }
70
- const tupleElements = firstGeneric.node.getElements();
71
- if (!tupleElements?.length) {
72
- return;
73
- }
74
- return tupleElements.map((node, index) => {
75
- return {
76
- index,
77
- text: node.getText()
78
- };
79
- });
80
- };
81
- var extractRouteMethods = (callExpression, route) => {
82
- const funcDeclaration = callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) || callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);
83
- if (!funcDeclaration) {
84
- return [];
85
- }
86
- const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(
87
- SyntaxKind.ArrayLiteralExpression
88
- );
89
- if (!arrayLiteralExpression) {
90
- return [];
91
- }
92
- const callExpressions = [];
93
- for (const e of arrayLiteralExpression.getChildrenOfKind(
94
- SyntaxKind.CallExpression
95
- )) {
96
- const name = e.getExpression().getText();
97
- if (HTTPMethods[name]) {
98
- callExpressions.push([e, name]);
99
- }
100
- }
101
- const methods = [];
102
- const skipValidationFilter = (e) => /@skip-validation/.test(e);
103
- for (const [callExpression2, method] of callExpressions) {
104
- const [payloadGeneric, responseGeneric] = extractGenerics(callExpression2);
105
- const payloadText = payloadGeneric?.node ? payloadGeneric.node.getChildren().length === 0 ? "{}" : payloadGeneric.node.getFullText() : void 0;
106
- const responseText = responseGeneric?.node.getText();
107
- const responseType = responseText ? {
108
- id: ["ResponseT", crc(route.importName + method)].join(""),
109
- method,
110
- skipValidation: responseGeneric?.comments ? responseGeneric.comments.some(skipValidationFilter) : false,
111
- text: ["never", "object"].includes(responseText) ? "{}" : responseText,
112
- resolvedType: void 0
113
- } : void 0;
114
- const payloadType = payloadText ? {
115
- id: ["PayloadT", crc(route.importName + method)].join(""),
116
- responseTypeId: responseType?.id,
117
- method,
118
- skipValidation: payloadGeneric?.comments ? payloadGeneric.comments.some(skipValidationFilter) : false,
119
- isOptional: payloadText ? payloadText === "{}" || route.optionalParams : true,
120
- text: payloadText,
121
- resolvedType: void 0
122
- } : void 0;
123
- methods.push({
124
- method,
125
- payloadType,
126
- responseType
127
- });
128
- }
129
- return methods;
130
- };
131
- var extractTypeDeclarations = (sourceFile, opts) => {
132
- const declarations = [];
133
- const referencedFiles = opts?.withReferencedFiles ? [] : void 0;
134
- for (const declaration of sourceFile.getImportDeclarations()) {
135
- const modulePath = declaration.getModuleSpecifierValue();
136
- const path = /^\.\.?\/?/.test(modulePath) ? opts?.relpathResolver ? opts.relpathResolver(modulePath) : modulePath : modulePath;
137
- const typeOnlyDeclaration = declaration.isTypeOnly();
138
- const defaultImport = typeOnlyDeclaration ? declaration.getDefaultImport() : void 0;
139
- if (defaultImport) {
140
- const name = defaultImport.getText();
141
- const text = `import type ${name} from "${path}";`;
142
- declarations.push({
143
- importDeclaration: {
144
- name,
145
- path
146
- },
147
- text
148
- });
149
- if (referencedFiles) {
150
- referencedFiles.push(...getReferencedFiles(defaultImport));
151
- }
152
- }
153
- for (const namedImport of declaration.getNamedImports()) {
154
- if (namedImport.isTypeOnly() || typeOnlyDeclaration) {
155
- const nameNode = namedImport.getNameNode();
156
- const name = nameNode.getText();
157
- const alias = namedImport.getAliasNode()?.getText();
158
- const nameText = alias ? `${name} as ${alias}` : name;
159
- declarations.push({
160
- importDeclaration: {
161
- name,
162
- alias,
163
- path
164
- },
165
- text: `import type { ${nameText} } from "${path}";`
166
- });
167
- if (referencedFiles) {
168
- if (nameNode.isKind(SyntaxKind.Identifier)) {
169
- referencedFiles.push(...getReferencedFiles(nameNode));
170
- }
171
- }
172
- }
173
- }
174
- }
175
- for (const declaration of sourceFile.getTypeAliases()) {
176
- const name = declaration.getName();
177
- const text = declaration.getFullText().trim();
178
- declarations.push({
179
- typeAliasDeclaration: { name },
180
- text
181
- });
182
- }
183
- for (const declaration of sourceFile.getInterfaces()) {
184
- const name = declaration.getName();
185
- const text = declaration.getFullText().trim();
186
- declarations.push({
187
- interfaceDeclaration: { name },
188
- text
189
- });
190
- }
191
- for (const declaration of sourceFile.getEnums()) {
192
- const name = declaration.getName();
193
- const text = declaration.getFullText().trim();
194
- declarations.push({
195
- enumDeclaration: { name },
196
- text
197
- });
198
- }
199
- for (const declaration of sourceFile.getExportDeclarations()) {
200
- const typeOnlyDeclaration = declaration.isTypeOnly();
201
- const modulePath = declaration.getModuleSpecifierValue();
202
- const path = modulePath ? /^\.\.?\/?/.test(modulePath) ? opts?.relpathResolver ? opts.relpathResolver(modulePath) : modulePath : modulePath : void 0;
203
- for (const namedExport of declaration.getNamedExports()) {
204
- if (namedExport.isTypeOnly() || typeOnlyDeclaration) {
205
- const nameNode = namedExport.getNameNode();
206
- const name = nameNode.getText();
207
- const alias = namedExport.getAliasNode()?.getText();
208
- const nameText = alias ? `${name} as ${alias}` : name;
209
- declarations.push({
210
- exportDeclaration: {
211
- name,
212
- alias: alias ?? name,
213
- path
214
- },
215
- text: path ? `export type { ${nameText} } from "${path}";` : `export type { ${nameText} };`
216
- });
217
- if (referencedFiles) {
218
- if (nameNode.isKind(SyntaxKind.Identifier)) {
219
- referencedFiles.push(...getReferencedFiles(nameNode));
220
- }
221
- }
222
- }
223
- }
224
- }
225
- return referencedFiles ? [declarations, [...new Set(referencedFiles)]] : [declarations];
226
- };
227
- var getReferencedFiles = (importIdentifier) => {
228
- const declarations = importIdentifier?.getSymbol()?.getAliasedSymbol()?.getDeclarations() || [];
229
- return declarations.flatMap((e) => {
230
- const sourceFile = e.getSourceFile();
231
- return sourceFile ? [sourceFile.getFilePath()] : [];
232
- });
233
- };
234
- var extractGenerics = (callExpression) => {
235
- return callExpression.getTypeArguments().map((node) => {
236
- return {
237
- node,
238
- comments: node.getLeadingCommentRanges().map((range) => range.getText().trim())
239
- };
240
- });
241
- };
242
- var typeResolverFactory = ({ appRoot }) => {
243
- const project = createProject({
244
- tsConfigFilePath: resolve(appRoot, "tsconfig.json"),
245
- skipAddingFilesFromTsConfig: true
246
- });
247
- const literalTypesResolver = (literalTypes, options) => {
248
- const sourceFile = project.createSourceFile(
249
- `${crc(literalTypes)}-${Date.now()}.ts`,
250
- literalTypes,
251
- { overwrite: true }
252
- );
253
- const resolvedTypes = flattener(project, sourceFile, {
254
- ...options,
255
- stripComments: true
256
- });
257
- project.removeSourceFile(sourceFile);
258
- return resolvedTypes;
259
- };
260
- return {
261
- getSourceFile: (fileFullpath) => {
262
- return project.getSourceFile(fileFullpath) || project.addSourceFileAtPath(fileFullpath);
263
- },
264
- refreshSourceFile: async (fileFullpath) => {
265
- const sourceFile = project.getSourceFile(fileFullpath);
266
- if (sourceFile) {
267
- await sourceFile.refreshFromFileSystem();
268
- }
269
- },
270
- literalTypesResolver
271
- };
272
- };
273
-
274
- // src/base-plugin/cache.ts
275
- import { mkdir, readFile, writeFile } from "node:fs/promises";
276
- import { dirname, resolve as resolve2 } from "node:path";
277
- import crc2 from "crc/crc32";
278
- import self from "@kosmojs/dev/package.json" with { type: "json" };
279
- import { pathExists, pathResolver } from "@kosmojs/devlib";
280
- var cacheFactory = (route, {
281
- appRoot,
282
- sourceFolder,
283
- extraContext
284
- }) => {
285
- const cacheFile = pathResolver({
286
- appRoot,
287
- sourceFolder
288
- }).resolve("apiLibDir", dirname(route.file), "cache.json");
289
- const getCache = async (opt) => {
290
- if (await pathExists(cacheFile)) {
291
- try {
292
- const cache = JSON.parse(await readFile(cacheFile, "utf8"));
293
- return opt?.validate ? validateCache(cache) : cache;
294
- } catch (_e) {
295
- }
296
- }
297
- return void 0;
298
- };
299
- const persistCache = async ({
300
- referencedFiles: _referencedFiles,
301
- ...rest
302
- }) => {
303
- const hash = await generateFileHash(route.fileFullpath, {
304
- ...extraContext
305
- });
306
- const referencedFiles = {};
307
- for (const file of _referencedFiles) {
308
- referencedFiles[
309
- // Strip project root to ensure cached paths are relative
310
- // and portable across environments (CI, local, etc.)
311
- file.replace(`${appRoot}/`, "")
312
- ] = await generateFileHash(file);
313
- }
314
- const cache = { ...rest, hash, referencedFiles };
315
- await mkdir(dirname(cacheFile), { recursive: true });
316
- await writeFile(cacheFile, JSON.stringify(cache, null, 2), "utf8");
317
- return cache;
318
- };
319
- const validateCache = async (cache) => {
320
- if (!cache?.hash) {
321
- return;
322
- }
323
- if (!cache.typeDeclarations || !cache.referencedFiles) {
324
- return;
325
- }
326
- const hash = await generateFileHash(route.fileFullpath, {
327
- ...extraContext
328
- });
329
- if (!identicalHashSum(cache.hash, hash)) {
330
- return;
331
- }
332
- for (const [file, hash2] of Object.entries(cache.referencedFiles)) {
333
- if (!identicalHashSum(hash2, await generateFileHash(resolve2(appRoot, file)))) {
334
- return;
335
- }
336
- }
337
- return cache;
338
- };
339
- return {
340
- getCache,
341
- validateCache,
342
- persistCache
343
- };
344
- };
345
- var generateFileHash = async (file, extraContext) => {
346
- let fileContent;
347
- try {
348
- fileContent = await readFile(file, "utf8");
349
- } catch (_e) {
350
- return 0;
351
- }
352
- return fileContent ? crc2(
353
- JSON.stringify({
354
- ...extraContext,
355
- [self.cacheVersion]: fileContent
356
- })
357
- ) : 0;
358
- };
359
- var identicalHashSum = (a, b) => {
360
- return a === b;
361
- };
362
-
363
- // src/base-plugin/templates/resolved-types.hbs
364
- var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n";
365
-
366
- // src/base-plugin/templates/types.hbs
367
- 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';
368
-
369
- // src/base-plugin/routes/resolve.ts
370
- var API_INDEX_BASENAME = "index";
371
- var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
372
- var API_USE_BASENAME = "use";
373
- var API_USE_PATTERN = `${API_USE_BASENAME}.ts`;
374
- var PAGE_INDEX_BASENAME = "index";
375
- var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
376
- var PAGE_LAYOUT_BASENAME = "layout";
377
- var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
378
- var ROUTE_FILE_PATTERNS = [
379
- // match index files in api dir
380
- `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
381
- // match use files in api dir
382
- `${defaults.apiDir}/**/${API_USE_PATTERN}`,
383
- // match index files in pages dir
384
- `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
385
- // match layout files in pages dir
386
- `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
387
- ];
388
- var scanRoutes = async ({
389
- appRoot,
390
- sourceFolder
391
- }) => {
392
- return glob(ROUTE_FILE_PATTERNS, {
393
- cwd: resolve3(appRoot, sourceFolder),
394
- absolute: true,
395
- onlyFiles: true,
396
- followSymbolicLinks: false,
397
- ignore: [
398
- // ignore top-level matches, routes resides in folders, even index route
399
- `${defaults.apiDir}/${API_INDEX_PATTERN}`,
400
- `${defaults.apiDir}/${API_USE_PATTERN}`,
401
- `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
402
- `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
403
- ]
404
- });
405
- };
406
- var isRouteFile = (file, {
407
- appRoot,
408
- sourceFolder
409
- }) => {
410
- const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/`, "").split("/");
411
- if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
412
- return;
413
- }
414
- return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
415
- };
416
- var isApiRoute = (file) => {
417
- return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
418
- };
419
- var isApiUse = (file) => {
420
- return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);
421
- };
422
- var isPageRoute = (file) => {
423
- return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
424
- };
425
- var isPageLayout = (file) => {
426
- return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
427
- };
428
- var createRouteEntry = (_file, {
429
- appRoot,
430
- sourceFolder
431
- }) => {
432
- const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
433
- if (!resolvedPaths) {
434
- return;
435
- }
436
- const [folder, file] = resolvedPaths;
437
- const fileFullpath = join(appRoot, sourceFolder, folder, file);
438
- const pathTokens = pathTokensFactory(dirname2(file));
439
- const name = pathTokens.map((e) => e.orig).join("/");
440
- const importFile = file;
441
- const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
442
- return {
443
- name,
444
- folder,
445
- file,
446
- fileFullpath,
447
- pathTokens,
448
- importFile,
449
- importName
450
- };
451
- };
452
- var pageLayoutResolverFactory = () => {
453
- return (entry) => {
454
- const { name } = entry;
455
- const handler = async () => {
456
- return {
457
- kind: "pageLayout",
458
- entry
459
- };
460
- };
461
- return { name, handler };
462
- };
463
- };
464
- var pageRouteResolverFactory = () => {
465
- return (entry) => {
466
- const {
467
- name,
468
- folder,
469
- file,
470
- fileFullpath,
471
- pathTokens,
472
- importFile,
473
- importName
474
- } = entry;
475
- const handler = async () => {
476
- const entry2 = {
477
- name,
478
- pathTokens,
479
- params: {
480
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
481
- },
482
- folder,
483
- file,
484
- fileFullpath,
485
- importFile,
486
- importName
487
- };
488
- return {
489
- kind: "pageRoute",
490
- entry: entry2
491
- };
492
- };
493
- return { name, handler };
494
- };
495
- };
496
- var apiUseResolverFactory = () => {
497
- return (entry) => {
498
- const { name } = entry;
499
- const handler = async () => {
500
- return {
501
- kind: "apiUse",
502
- entry
503
- };
504
- };
505
- return { name, handler };
506
- };
507
- };
508
- var apiRouteResolverFactory = (pluginOptions) => {
509
- const {
510
- appRoot,
511
- sourceFolder,
512
- generators = [],
513
- formatters = [],
514
- refineTypeName
515
- } = pluginOptions;
516
- let resolveTypes = false;
517
- for (const { options } of generators) {
518
- if (options?.resolveTypes) {
519
- resolveTypes = true;
520
- }
521
- }
522
- const {
523
- //
524
- literalTypesResolver,
525
- getSourceFile,
526
- refreshSourceFile
527
- } = typeResolverFactory(pluginOptions);
528
- return (entry) => {
529
- const {
530
- name,
531
- file,
532
- folder,
533
- fileFullpath,
534
- pathTokens,
535
- importFile,
536
- importName
537
- } = entry;
538
- const handler = async (updatedFile) => {
539
- const paramsSchema = pathTokens.flatMap((e) => {
540
- return e.param ? [e.param] : [];
541
- });
542
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
543
- const { getCache, persistCache } = cacheFactory(
544
- { file, fileFullpath, importName },
545
- {
546
- appRoot,
547
- sourceFolder,
548
- extraContext: { resolveTypes }
549
- }
550
- );
551
- let cache = await getCache({ validate: true });
552
- if (!cache) {
553
- if (updatedFile === fileFullpath) {
554
- await refreshSourceFile(fileFullpath);
555
- }
556
- const {
557
- typeDeclarations,
558
- paramsRefinements,
559
- methods,
560
- payloadTypes,
561
- responseTypes,
562
- referencedFiles = []
563
- } = await resolveRouteSignature(
564
- { importName, fileFullpath, optionalParams },
565
- {
566
- withReferencedFiles: true,
567
- sourceFile: getSourceFile(fileFullpath),
568
- relpathResolver(path) {
569
- return join(sourceFolder, defaults.apiDir, dirname2(file), path);
570
- }
571
- }
572
- );
573
- const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
574
- if (text === "number") {
575
- const param = paramsSchema.at(index);
576
- return param ? [param.name] : [];
577
- }
578
- return [];
579
- }) : [];
580
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
581
- "apiLibDir",
582
- dirname2(file),
583
- "types.ts"
584
- );
585
- const params = {
586
- id: ["ParamsT", crc3(name)].join(""),
587
- schema: paramsSchema,
588
- resolvedType: void 0
589
- };
590
- const typesFileContent = render(types_default, {
591
- params,
592
- paramsSchema: paramsSchema.map((param, index) => {
593
- return {
594
- ...param,
595
- refinement: paramsRefinements?.at(index)
596
- };
597
- }),
598
- typeDeclarations,
599
- payloadTypes,
600
- responseTypes
601
- });
602
- const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
603
- overrides: [...payloadTypes, ...responseTypes].reduce(
604
- (map, { id, skipValidation }) => {
605
- if (skipValidation) {
606
- map[id] = "never";
607
- }
608
- return map;
609
- },
610
- { [refineTypeName]: refineTypeName }
611
- ),
612
- withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
613
- formatters
614
- }) : void 0;
615
- await renderToFile(
616
- typesFile,
617
- resolvedTypes ? resolved_types_default : typesFileContent,
618
- { resolvedTypes }
619
- );
620
- params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
621
- cache = await persistCache({
622
- params,
623
- methods,
624
- typeDeclarations,
625
- numericParams,
626
- // text was needed at writing types.ts file, dropping from cache
627
- payloadTypes: payloadTypes.map(({ text, ...rest }) => {
628
- return {
629
- ...rest,
630
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
631
- };
632
- }),
633
- responseTypes: responseTypes.map(({ text, ...rest }) => {
634
- return {
635
- ...rest,
636
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
637
- };
638
- }),
639
- referencedFiles
640
- });
641
- }
642
- const entry2 = {
643
- name,
644
- pathTokens,
645
- params: cache.params,
646
- numericParams: cache.numericParams,
647
- optionalParams,
648
- importName,
649
- importFile,
650
- folder,
651
- file,
652
- fileFullpath,
653
- methods: cache.methods,
654
- typeDeclarations: cache.typeDeclarations,
655
- payloadTypes: cache.payloadTypes,
656
- responseTypes: cache.responseTypes,
657
- referencedFiles: Object.keys(cache.referencedFiles).map(
658
- // expand referenced files path,
659
- // they are stored as relative in cache
660
- (e) => resolve3(appRoot, e)
661
- )
662
- };
663
- return {
664
- kind: "apiRoute",
665
- entry: entry2
666
- };
667
- };
668
- return { name, handler };
669
- };
670
- };
671
-
672
- // src/base-plugin/routes/nesting.ts
673
- import { basename } from "node:path";
674
- import {
675
- sortRoutes
676
- } from "@kosmojs/devlib";
677
- var nestedRoutesFactory = (routeEntries) => {
678
- const entryStack = structuredClone(routeEntries).sort(sortRoutes);
679
- const transformEntries = (entries, parent) => {
680
- return [...new Set(entries.map((e) => e.name))].flatMap((name) => {
681
- const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {
682
- return entry.name === name ? [entry] : [];
683
- });
684
- const index = nameEntries.find(
685
- (e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME)
686
- );
687
- const layout = nameEntries.find(
688
- (e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME)
689
- );
690
- if (index || layout) {
691
- return [
692
- {
693
- index: index ? {
694
- ...index,
695
- pathTokens: index.pathTokens.slice(
696
- parent?.pathTokens.length || 0
697
- )
698
- } : void 0,
699
- layout: layout ? {
700
- ...layout,
701
- pathTokens: layout.pathTokens.slice(
702
- parent?.pathTokens.length || 0
703
- )
704
- } : void 0,
705
- parent: parent?.name,
706
- children: transformEntries(
707
- findDescendantEntries(index || layout),
708
- index || layout
709
- )
710
- }
711
- ];
712
- }
713
- return [];
714
- });
715
- };
716
- const findDescendantEntries = ({
717
- name,
718
- pathTokens
719
- }) => {
720
- const potentialChildren = entryStack.filter((entry) => {
721
- if (entry.pathTokens.length <= pathTokens.length) {
722
- return false;
723
- }
724
- if (!entry.name.startsWith(`${name}/`)) {
725
- return false;
726
- }
727
- return true;
728
- });
729
- return potentialChildren.filter((child) => {
730
- const hasIntermediateRoute = potentialChildren.some((intermediate) => {
731
- if (intermediate === child) {
732
- return false;
733
- }
734
- if (intermediate.pathTokens.length <= pathTokens.length) {
735
- return false;
736
- }
737
- if (intermediate.pathTokens.length >= child.pathTokens.length) {
738
- return false;
739
- }
740
- return child.name.startsWith(`${intermediate.name}/`);
741
- });
742
- return !hasIntermediateRoute;
743
- });
744
- };
745
- const rootEntries = entryStack.filter((entry) => {
746
- const hasParent = entryStack.some((potential) => {
747
- if (potential === entry) {
748
- return false;
749
- }
750
- if (potential.pathTokens.length >= entry.pathTokens.length) {
751
- return false;
752
- }
753
- return entry.name.startsWith(`${potential.name}/`);
754
- });
755
- return !hasParent;
756
- });
757
- return transformEntries(rootEntries);
758
- };
759
-
760
- // src/base-plugin/routes.ts
761
- var routes_default = async (pluginOptions) => {
762
- const { appRoot, sourceFolder } = pluginOptions;
763
- const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
764
- const apiUseResolver = apiUseResolverFactory(pluginOptions);
765
- const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
766
- const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
767
- const resolversFactory = (routeFiles2) => {
768
- const resolvers = /* @__PURE__ */ new Map();
769
- const entries = routeFiles2.flatMap((file) => {
770
- const entry = createRouteEntry(file, pluginOptions);
771
- return entry ? [entry] : [];
772
- });
773
- for (const entry of entries) {
774
- if (entry.folder === defaults2.apiDir) {
775
- if (isApiRoute(entry.file)) {
776
- resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
777
- } else if (isApiUse(entry.file)) {
778
- resolvers.set(entry.fileFullpath, apiUseResolver(entry));
779
- }
780
- } else if (entry.folder === defaults2.pagesDir) {
781
- if (isPageRoute(entry.file)) {
782
- resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
783
- } else if (isPageLayout(entry.file)) {
784
- resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
785
- }
786
- }
787
- }
788
- return resolvers;
789
- };
790
- const routeFiles = await scanRoutes({ appRoot, sourceFolder });
791
- return {
792
- resolvers: resolversFactory(routeFiles),
793
- resolversFactory
794
- };
795
- };
796
- export {
797
- API_INDEX_BASENAME,
798
- API_INDEX_PATTERN,
799
- API_USE_BASENAME,
800
- API_USE_PATTERN,
801
- PAGE_INDEX_BASENAME,
802
- PAGE_INDEX_PATTERN,
803
- PAGE_LAYOUT_BASENAME,
804
- PAGE_LAYOUT_PATTERN,
805
- apiRouteResolverFactory,
806
- apiUseResolverFactory,
807
- createRouteEntry,
808
- routes_default as default,
809
- isApiRoute,
810
- isApiUse,
811
- isPageLayout,
812
- isPageRoute,
813
- isRouteFile,
814
- nestedRoutesFactory,
815
- pageLayoutResolverFactory,
816
- pageRouteResolverFactory,
817
- scanRoutes
818
- };
819
- //# sourceMappingURL=routes.js.map