@kosmojs/dev 0.0.20 → 0.0.22

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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +11 -10
  3. package/pkg/{src/ast.d.ts → ast.d.ts} +11 -16
  4. package/pkg/{src/base-plugin → base-plugin}/api-handler.d.ts +1 -1
  5. package/pkg/{src/base-plugin → base-plugin}/worker.d.ts +1 -2
  6. package/pkg/base-plugin/worker.js +489 -221
  7. package/pkg/base-plugin/worker.js.map +4 -4
  8. package/pkg/{src/cache.d.ts → cache.d.ts} +1 -1
  9. package/pkg/index.js +640 -296
  10. package/pkg/index.js.map +4 -4
  11. package/pkg/{src/paths.d.ts → paths.d.ts} +2 -2
  12. package/pkg/{src/render.d.ts → render.d.ts} +4 -4
  13. package/pkg/routes-factory/base.d.ts +47 -0
  14. package/pkg/{src/routes-factory → routes-factory}/index.d.ts +1 -0
  15. package/pkg/stub-generator/index.js +1 -12
  16. package/pkg/stub-generator/index.js.map +2 -2
  17. package/pkg/{src/types.d.ts → types.d.ts} +55 -38
  18. package/pkg/src/routes-factory/base.d.ts +0 -17
  19. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +0 -3
  20. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/types.d.ts +0 -3
  21. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +0 -4
  22. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/types.d.ts +0 -4
  23. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +0 -3
  24. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/types.d.ts +0 -3
  25. package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +0 -1
  26. package/pkg/test/@fixtures/app/lib/@src/{api}/books/types.d.ts +0 -1
  27. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +0 -4
  28. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/types.d.ts +0 -4
  29. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +0 -3
  30. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/types.d.ts +0 -3
  31. package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +0 -1
  32. package/pkg/test/@fixtures/app/lib/@src/{api}/index/types.d.ts +0 -1
  33. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +0 -3
  34. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/types.d.ts +0 -3
  35. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +0 -3
  36. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/types.d.ts +0 -3
  37. package/pkg/test/@fixtures/app/src/test/api/articles/[...path]/index.d.ts +0 -0
  38. package/pkg/test/@fixtures/app/src/test/api/books/[category]/[[author]]/index.d.ts +0 -0
  39. package/pkg/test/@fixtures/app/src/test/api/books/[category]/index.d.ts +0 -0
  40. package/pkg/test/@fixtures/app/src/test/api/books/index.d.ts +0 -0
  41. package/pkg/test/@fixtures/app/src/test/api/files/[[folder]]/[[id]].json/index.d.ts +0 -0
  42. package/pkg/test/@fixtures/app/src/test/api/files/[[folder]]/index.d.ts +0 -0
  43. package/pkg/test/@fixtures/app/src/test/api/index/index.d.ts +0 -0
  44. package/pkg/test/@fixtures/app/src/test/api/pages/[...path].html/index.d.ts +0 -0
  45. package/pkg/test/@fixtures/app/src/test/api/users/[id].json/index.d.ts +0 -0
  46. package/pkg/test/@fixtures/app/src/test/pages/about/careers/[jobId]/index.d.ts +0 -0
  47. package/pkg/test/@fixtures/app/src/test/pages/about/careers/layout.d.ts +0 -0
  48. package/pkg/test/@fixtures/app/src/test/pages/about/index.d.ts +0 -0
  49. package/pkg/test/@fixtures/app/src/test/pages/about/layout.d.ts +0 -0
  50. package/pkg/test/@fixtures/app/src/test/pages/about/team/index.d.ts +0 -0
  51. package/pkg/test/@fixtures/app/src/test/pages/account/layout.d.ts +0 -0
  52. package/pkg/test/@fixtures/app/src/test/pages/account/profile/index.d.ts +0 -0
  53. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/index.d.ts +0 -0
  54. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  55. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  56. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  57. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/resources/index.d.ts +0 -0
  58. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  59. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  60. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/settings/index.d.ts +0 -0
  61. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  62. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  63. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  64. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/users/index.d.ts +0 -0
  65. package/pkg/test/@fixtures/app/src/test/pages/admin/[tenant]/users/layout.d.ts +0 -0
  66. package/pkg/test/@fixtures/app/src/test/pages/admin/index.d.ts +0 -0
  67. package/pkg/test/@fixtures/app/src/test/pages/admin/layout.d.ts +0 -0
  68. package/pkg/test/@fixtures/app/src/test/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  69. package/pkg/test/@fixtures/app/src/test/pages/blog/[[category]]/index.d.ts +0 -0
  70. package/pkg/test/@fixtures/app/src/test/pages/blog/index.d.ts +0 -0
  71. package/pkg/test/@fixtures/app/src/test/pages/blog/layout.d.ts +0 -0
  72. package/pkg/test/@fixtures/app/src/test/pages/blog/post/[slug]/index.d.ts +0 -0
  73. package/pkg/test/@fixtures/app/src/test/pages/blog/post/[slug]/layout.d.ts +0 -0
  74. package/pkg/test/@fixtures/app/src/test/pages/contact/index.d.ts +0 -0
  75. package/pkg/test/@fixtures/app/src/test/pages/contact/layout.d.ts +0 -0
  76. package/pkg/test/@fixtures/app/src/test/pages/courses/[courseId]/layout.d.ts +0 -0
  77. package/pkg/test/@fixtures/app/src/test/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  78. package/pkg/test/@fixtures/app/src/test/pages/dashboard/[view]/index.d.ts +0 -0
  79. package/pkg/test/@fixtures/app/src/test/pages/dashboard/analytics/index.d.ts +0 -0
  80. package/pkg/test/@fixtures/app/src/test/pages/dashboard/index.d.ts +0 -0
  81. package/pkg/test/@fixtures/app/src/test/pages/dashboard/layout.d.ts +0 -0
  82. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/billing/index.d.ts +0 -0
  83. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/index.d.ts +0 -0
  84. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/layout.d.ts +0 -0
  85. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/notifications/index.d.ts +0 -0
  86. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/profile/index.d.ts +0 -0
  87. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/security/index.d.ts +0 -0
  88. package/pkg/test/@fixtures/app/src/test/pages/dashboard/settings/security/layout.d.ts +0 -0
  89. package/pkg/test/@fixtures/app/src/test/pages/docs/[...path]/index.d.ts +0 -0
  90. package/pkg/test/@fixtures/app/src/test/pages/docs/index.d.ts +0 -0
  91. package/pkg/test/@fixtures/app/src/test/pages/docs/layout.d.ts +0 -0
  92. package/pkg/test/@fixtures/app/src/test/pages/files/[...filePath]/index.d.ts +0 -0
  93. package/pkg/test/@fixtures/app/src/test/pages/files/[...filePath]/layout.d.ts +0 -0
  94. package/pkg/test/@fixtures/app/src/test/pages/legal/layout.d.ts +0 -0
  95. package/pkg/test/@fixtures/app/src/test/pages/legal/privacy/index.d.ts +0 -0
  96. package/pkg/test/@fixtures/app/src/test/pages/legal/terms/index.d.ts +0 -0
  97. package/pkg/test/@fixtures/app/src/test/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  98. package/pkg/test/@fixtures/app/src/test/pages/news/[category]/layout.d.ts +0 -0
  99. package/pkg/test/@fixtures/app/src/test/pages/portal/[clientId]/layout.d.ts +0 -0
  100. package/pkg/test/@fixtures/app/src/test/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  101. package/pkg/test/@fixtures/app/src/test/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  102. package/pkg/test/@fixtures/app/src/test/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  103. package/pkg/test/@fixtures/app/src/test/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  104. package/pkg/test/@fixtures/app/src/test/pages/portal/layout.d.ts +0 -0
  105. package/pkg/test/@fixtures/app/src/test/pages/products/[id]/index.d.ts +0 -0
  106. package/pkg/test/@fixtures/app/src/test/pages/products/index.d.ts +0 -0
  107. package/pkg/test/@fixtures/app/src/test/pages/profile/[username]/layout.d.ts +0 -0
  108. package/pkg/test/@fixtures/app/src/test/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  109. package/pkg/test/@fixtures/app/src/test/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  110. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  111. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/files/index.d.ts +0 -0
  112. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/files/layout.d.ts +0 -0
  113. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/index.d.ts +0 -0
  114. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/layout.d.ts +0 -0
  115. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  116. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  117. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  118. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  119. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  120. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  121. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  122. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  123. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/team/index.d.ts +0 -0
  124. package/pkg/test/@fixtures/app/src/test/pages/projects/[projectId]/team/layout.d.ts +0 -0
  125. package/pkg/test/@fixtures/app/src/test/pages/projects/index.d.ts +0 -0
  126. package/pkg/test/@fixtures/app/src/test/pages/projects/layout.d.ts +0 -0
  127. package/pkg/test/@fixtures/app/src/test/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  128. package/pkg/test/@fixtures/app/src/test/pages/properties/filters/index.d.ts +0 -0
  129. package/pkg/test/@fixtures/app/src/test/pages/properties/layout.d.ts +0 -0
  130. package/pkg/test/@fixtures/app/src/test/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  131. package/pkg/test/@fixtures/app/src/test/pages/search/[[query]]/layout.d.ts +0 -0
  132. package/pkg/test/@fixtures/app/src/test/pages/search/index.d.ts +0 -0
  133. package/pkg/test/@fixtures/app/src/test/pages/shop/[category]/[productId]/index.d.ts +0 -0
  134. package/pkg/test/@fixtures/app/src/test/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  135. package/pkg/test/@fixtures/app/src/test/pages/shop/cart/index.d.ts +0 -0
  136. package/pkg/test/@fixtures/app/src/test/pages/shop/checkout/confirm/index.d.ts +0 -0
  137. package/pkg/test/@fixtures/app/src/test/pages/shop/checkout/layout.d.ts +0 -0
  138. package/pkg/test/@fixtures/app/src/test/pages/shop/checkout/payment/index.d.ts +0 -0
  139. package/pkg/test/@fixtures/app/src/test/pages/shop/checkout/shipping/index.d.ts +0 -0
  140. package/pkg/test/@fixtures/app/src/test/pages/shop/checkout/shipping/layout.d.ts +0 -0
  141. package/pkg/test/@fixtures/app/src/test/pages/shop/index.d.ts +0 -0
  142. package/pkg/test/@fixtures/app/src/test/pages/shop/layout.d.ts +0 -0
  143. package/pkg/test/@fixtures/app/src/test/pages/shop/orders/[orderId]/index.d.ts +0 -0
  144. package/pkg/test/@fixtures/app/src/test/pages/shop/orders/index.d.ts +0 -0
  145. package/pkg/test/@fixtures/app/src/test/pages/shop/orders/layout.d.ts +0 -0
  146. package/pkg/test/@fixtures/app/src/test/pages/shop/product/[id]/index.d.ts +0 -0
  147. package/pkg/test/@fixtures/app/src/test/pages/shop/product/[id]/layout.d.ts +0 -0
  148. package/pkg/test/@fixtures/app/src/test/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  149. package/pkg/test/@fixtures/app/src/test/pages/shop/products/[[category]]/index.d.ts +0 -0
  150. package/pkg/test/@fixtures/app/src/test/pages/shop/products/index.d.ts +0 -0
  151. package/pkg/test/@fixtures/app/src/test/pages/shop/products/layout.d.ts +0 -0
  152. package/pkg/test/@fixtures/app/src/test/pages/signup/index.d.ts +0 -0
  153. package/pkg/test/@fixtures/app/src/test/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  154. package/pkg/test/@fixtures/app/src/test/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  155. package/pkg/test/@fixtures/app/src/test/pages/store/[category]/sort/layout.d.ts +0 -0
  156. package/pkg/test/@fixtures/app/src/test/pages/store/layout.d.ts +0 -0
  157. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/followers/index.d.ts +0 -0
  158. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/following/index.d.ts +0 -0
  159. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/index.d.ts +0 -0
  160. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/layout.d.ts +0 -0
  161. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  162. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  163. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/posts/index.d.ts +0 -0
  164. package/pkg/test/@fixtures/app/src/test/pages/users/[username]/posts/layout.d.ts +0 -0
  165. package/pkg/test/@fixtures/app/src/test/pages/users/index.d.ts +0 -0
  166. package/pkg/test/@fixtures/app/src/test/pages/users/layout.d.ts +0 -0
  167. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  168. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  169. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  170. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  171. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  172. package/pkg/test/@fixtures/app/src/test/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  173. package/pkg/test/@fixtures/ast/extractTypeDeclarations/exports/with-referenced-files.d.ts +0 -1
  174. package/pkg/test/@fixtures/ast/extractTypeDeclarations/imports/with-referenced-files.d.ts +0 -1
  175. package/pkg/test/ast/extractParamsRefinements.test.d.ts +0 -1
  176. package/pkg/test/ast/extractRouteMethods.test.d.ts +0 -1
  177. package/pkg/test/ast/extractTypeDeclarations.test.d.ts +0 -1
  178. package/pkg/test/routes/index.d.ts +0 -4
  179. package/pkg/test/routes/nesting.test.d.ts +0 -1
  180. package/pkg/test/routes/resolver.test.d.ts +0 -1
  181. package/pkg/test/routes/routes.test.d.ts +0 -1
  182. /package/pkg/{src/alias-plugin → alias-plugin}/index.d.ts +0 -0
  183. /package/pkg/{src/base-plugin → base-plugin}/index.d.ts +0 -0
  184. /package/pkg/{src/base-plugin → base-plugin}/spinner.d.ts +0 -0
  185. /package/pkg/{src/defaults.d.ts → defaults.d.ts} +0 -0
  186. /package/pkg/{src/define-plugin → define-plugin}/index.d.ts +0 -0
  187. /package/pkg/{src/fs.d.ts → fs.d.ts} +0 -0
  188. /package/pkg/{src/index.d.ts → index.d.ts} +0 -0
  189. /package/pkg/{src/routes-factory → routes-factory}/nesting.d.ts +0 -0
  190. /package/pkg/{src/routes-factory → routes-factory}/resolve.d.ts +0 -0
  191. /package/pkg/{src/stub-generator → stub-generator}/index.d.ts +0 -0
  192. /package/pkg/{src/typebox.d.ts → typebox.d.ts} +0 -0
package/pkg/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/alias-plugin/index.ts", "../src/paths.ts", "../src/defaults.ts", "../src/base-plugin/index.ts", "../src/routes-factory/resolve.ts", "../src/render.ts", "../src/fs.ts", "../src/ast.ts", "../src/cache.ts", "../src/routes-factory/base.ts", "../src/routes-factory/templates/resolved-types.hbs", "../src/routes-factory/templates/types.hbs", "../src/routes-factory/nesting.ts", "../src/routes-factory/index.ts", "../src/base-plugin/api-handler.ts", "../src/base-plugin/spinner.ts", "../src/define-plugin/index.ts", "../src/typebox.ts"],
4
- "sourcesContent": ["import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nimport { createTsconfigPaths } from \"@/paths\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const paths: Record<string, Array<string>> = await import(\n `${appRoot}/tsconfig.json`,\n { with: { type: \"json\" } }\n ).then((e) => {\n return {\n ...e.default.compilerOptions?.paths,\n ...createTsconfigPaths(\".\"),\n };\n });\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries(paths);\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { join } from \"node:path\";\n\nimport { defaults } from \"./defaults\";\n\ntype CreateImport = Record<\n | \"coreApi\"\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"fetch\"\n | \"lib\"\n | \"libApi\"\n | \"libEntry\",\n (...a: Array<string>) => string\n>;\n\nexport const createTsconfigPaths = (prefix: string) => {\n return {\n [`${defaults.appPrefix}/*`]: [`${prefix}/*`],\n [`${defaults.srcPrefix}/*`]: [`${prefix}/${defaults.srcDir}/*`],\n [`${defaults.libPrefix}/*`]: [\n `${prefix}/${defaults.libDir}/${defaults.srcDir}/*`,\n ],\n };\n};\n\nexport const pathResolver = ({\n appRoot,\n sourceFolder,\n}: {\n appRoot?: string;\n sourceFolder: string;\n}): {\n createPath: Record<\n | \"coreApi\"\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"entry\"\n | \"fetch\"\n | \"lib\"\n | \"libApi\"\n | \"libEntry\"\n | \"libPages\",\n (...a: Array<string>) => string\n >;\n createImport: CreateImport;\n createImportHelper: (k: keyof CreateImport, ...a: Array<string>) => string;\n} => {\n const createPath = (...a: Array<string>) => {\n return appRoot ? join(appRoot, ...a) : join(...a);\n };\n\n const createImport: CreateImport = {\n coreApi(...a) {\n return join(defaults.appPrefix, defaults.coreDir, defaults.apiDir, ...a);\n },\n src(...a) {\n return join(defaults.srcPrefix, sourceFolder, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n lib(...a) {\n return join(defaults.libPrefix, sourceFolder, ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n fetch(...a) {\n return this.lib(defaults.fetchDir, ...a);\n },\n };\n\n return {\n createPath: {\n coreApi(...a) {\n return createPath(defaults.coreDir, defaults.apiDir, ...a);\n },\n src(...a) {\n return createPath(defaults.srcDir, sourceFolder, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n entry(...a) {\n return this.src(defaults.entryDir, ...a);\n },\n lib(...a) {\n return createPath(defaults.libDir, defaults.srcDir, sourceFolder, ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n libPages(...a) {\n return this.lib(defaults.pagesDir, ...a);\n },\n fetch(...a) {\n return this.lib(defaults.fetchDir, ...a);\n },\n },\n createImport,\n createImportHelper: (key, ...a) => {\n // Handlebars always appends an options object as the last argument,\n // slice it off before passing args to createImport\n return createImport[key](...a.slice(0, -1));\n },\n };\n};\n", "export const defaults = {\n appPrefix: \"~\",\n srcPrefix: \"@\",\n libPrefix: \"_\",\n\n coreDir: \"core\",\n srcDir: \"src\",\n libDir: \"lib\",\n\n configDir: \"config\",\n apiDir: \"api\",\n pagesDir: \"pages\",\n entryDir: \"entry\",\n fetchDir: \"fetch\",\n};\n", "import { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\n\nimport { routesFactory } from \"@/routes-factory\";\nimport type { PluginOptions, PluginOptionsResolved } from \"@/types\";\n\nimport apiHandlerFactory from \"./api-handler\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators, formatters) can't be passed to worker threads.\n const {\n generators = [],\n formatters = [],\n ...restOptions\n } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const formatterModules: WorkerData[\"formatterModules\"] =\n pluginOptions?.formatters\n ? pluginOptions.formatters.map((e) => [e.moduleImport, e.moduleConfig])\n : [];\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n formatterModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"../..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const {\n generators = [],\n formatters = [],\n refineTypeName = \"TRefine\",\n } = { ...pluginOptions };\n\n const apiGenerator = generators.find((e) => e.kind === \"api\");\n const fetchGenerator = generators.find((e) => e.kind === \"fetch\");\n const ssrGenerator = generators.find((e) => e.kind === \"ssr\");\n\n if (!apiGenerator || !fetchGenerator) {\n throw new Error(\n \"Some of required generators missing, make sure both `api` and `fetch` generators configured properly\",\n );\n }\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n apiGenerator,\n // 3. then fetch generator\n fetchGenerator,\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.kind //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.kind)\n : true;\n }),\n // 5. ssr generator should run last\n ...(ssrGenerator ? [ssrGenerator] : []),\n ],\n formatters: formatters.map((e) => e.formatter),\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedEntries = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedEntries.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { build } = await factory(store.resolvedOptions);\n await build(resolvedEntries);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport { defaults } from \"@/defaults\";\nimport { pathResolver } from \"@/paths\";\nimport { render, renderToFile } from \"@/render\";\nimport type {\n ApiRoute,\n PageRoute,\n PluginOptionsResolved,\n ResolvedEntry,\n RouteEntry,\n} from \"@/types\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"../ast\";\nimport { cacheFactory } from \"../cache\";\nimport { pathTokensFactory } from \"./base\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type ResolverSignature = {\n name: string;\n handler: (updatedFile?: string) => Promise<ResolvedEntry>;\n};\n\nexport const API_INDEX_BASENAME = \"index\";\nexport const API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;\n\nexport const API_USE_BASENAME = \"use\";\nexport const API_USE_PATTERN = `${API_USE_BASENAME}.ts`;\n\nexport const PAGE_INDEX_BASENAME = \"index\";\nexport const PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;\n\nexport const PAGE_LAYOUT_BASENAME = \"layout\";\nexport const PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;\n\nconst ROUTE_FILE_PATTERNS = [\n // match index files in api dir\n `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n // match use files in api dir\n `${defaults.apiDir}/**/${API_USE_PATTERN}`,\n // match index files in pages dir\n `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n // match layout files in pages dir\n `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`,\n];\n\nexport const scanRoutes = async ({\n appRoot,\n sourceFolder,\n}: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">) => {\n const { createPath } = pathResolver({ appRoot, sourceFolder });\n return glob(ROUTE_FILE_PATTERNS, {\n cwd: createPath.src(),\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n ignore: [\n // ignore top-level matches, routes resides in folders, even index route\n `${defaults.apiDir}/${API_INDEX_PATTERN}`,\n `${defaults.apiDir}/${API_USE_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`,\n ],\n });\n};\n\nexport const isRouteFile = (\n file: string,\n {\n appRoot,\n sourceFolder,\n }: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n):\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | false => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/${defaults.srcDir}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n * */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return false;\n }\n\n return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS)\n ? [folder, rest.join(\"/\")]\n : false;\n};\n\nexport const isApiRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);\n};\n\nexport const isApiUse = (file: string) => {\n return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);\n};\n\nexport const isPageRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);\n};\n\nexport const isPageLayout = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);\n};\n\nexport const createRouteEntry = (\n fileFullpath: string,\n {\n appRoot,\n sourceFolder,\n }: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n): RouteEntry | undefined => {\n // scanner already is doing a great job on matching only relevant files\n // but doing a double check here to make sure only needed files added to stack\n const resolvedPaths = isRouteFile(fileFullpath, { appRoot, sourceFolder });\n\n if (!resolvedPaths) {\n return;\n }\n\n const [folder, file] = resolvedPaths;\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n return {\n id: `${file.replace(/\\W+/g, \"_\")}_${crc(file)}`,\n name: pathTokens.map((e) => e.orig).join(\"/\"),\n folder,\n file,\n fileFullpath,\n pathTokens,\n };\n};\n\ntype ResolverFactory = (\n pluginOptions: PluginOptionsResolved,\n) => (entry: RouteEntry) => ResolverSignature;\n\nexport const pageLayoutResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"pageLayout\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const pageRouteResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { id, name, folder, file, fileFullpath, pathTokens } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n const entry: PageRoute = {\n id,\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n };\n\n return {\n kind: \"pageRoute\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const apiUseResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"apiUse\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const apiRouteResolverFactory: ResolverFactory = (pluginOptions) => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n return (entry) => {\n const { id, name, file, folder, fileFullpath, pathTokens } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { id, file, fileFullpath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { id, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({\n appRoot,\n sourceFolder,\n }).createPath.libApi(dirname(file), \"types.ts\");\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const entry: ApiRoute = {\n id,\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"apiRoute\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport handlebars from \"handlebars\";\n\nimport { pathExists } from \"./fs\";\n\nexport type RenderOptions = {\n noEscape?: boolean;\n // handlebars instance\n renderer?: typeof handlebars;\n};\n\nexport type FactoryOptions = RenderOptions & {\n /**\n * Controls whether to overwrite an existing file.\n * - `false`: skip writing if the file already exists\n * - `true` (default): always overwrite\n * - function: custom logic to decide whether to overwrite, based on current file content\n */\n overwrite?: boolean | ((fileContent: string) => boolean);\n formatters?: Array<Formatter>;\n};\n\ntype Formatter = (content: string, file: string) => string;\n\nexport const render = <Context = object>(\n template: string,\n context: Context,\n options?: RenderOptions,\n): string => {\n const { noEscape = true, renderer = handlebars } = { ...options };\n return renderer.compile(template, { noEscape })(context);\n};\n\nexport const renderAsFile = <Context = object>(\n file: string,\n template: string,\n context: Context,\n options?: Omit<FactoryOptions, \"overwrite\">,\n): string => {\n const { formatters, ...renderOpts } = { ...options };\n const content = render(template, context, renderOpts);\n return Array.isArray(formatters)\n ? formatters.reduce((c, f) => f(c, file), content)\n : content;\n};\n\nexport const renderToFile = async <Context = object>(\n file: string,\n template: string,\n context: Context,\n options?: FactoryOptions,\n): Promise<void> => {\n const content = renderAsFile(file, template, context, options);\n\n /**\n * Two fs calls (exists + read) are worth it to avoid touching the file\n * and triggering watchers unnecessarily.\n * */\n if (await pathExists(file)) {\n const { overwrite = true } = { ...options };\n if (overwrite === false) {\n return;\n }\n const fileContent = await readFile(file, \"utf8\");\n if (typeof overwrite === \"function\" && !overwrite(fileContent)) {\n return;\n }\n if (crc(content) === crc(fileContent)) {\n return;\n }\n }\n\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, content, \"utf8\");\n};\n\nexport const renderFactory = (\n options?: FactoryOptions & {\n outdir?: string;\n partials?: Record<string, string>;\n helpers?: Record<string, (...a: Array<never>) => unknown>;\n },\n) => {\n const renderer = handlebars.create();\n if (options?.partials) {\n renderer.registerPartial(options.partials as never);\n }\n if (options?.helpers) {\n renderer.registerHelper(options.helpers as never);\n }\n return {\n render<Context = object>(\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return render(template, context, {\n renderer,\n ...options,\n ...selfOoptions,\n });\n },\n async renderToFile<Context = object>(\n file: string,\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return renderToFile(\n options?.outdir ? join(options.outdir, file) : file,\n template,\n context,\n { renderer, ...options, ...selfOoptions },\n );\n },\n };\n};\n", "import { access, constants } from \"node:fs/promises\";\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\n\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@/types\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"id\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"id\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods: ReturnType<typeof extractRouteMethods> = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.id + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.id + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\n\nimport { pathExists } from \"@/fs\";\nimport { pathResolver } from \"@/paths\";\nimport type { ApiRoute } from \"@/types\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"id\" | \"file\" | \"fileFullpath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).createPath.libApi(dirname(route.file), \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "import crc from \"crc/crc32\";\n\nimport type { PathToken, RouteEntry } from \"@/types\";\n\nexport const pathTokensFactory = (path: string): Array<PathToken> => {\n const requiredParamRegex = /^\\[([^\\]]+)\\]$/;\n const optionalParamRegex = /^\\[\\[([^\\]]+)\\]\\]$/;\n const restParamRegex = /^\\[\\.\\.\\.([^\\]]+)\\]$/;\n\n return path.split(\"/\").map((orig, i) => {\n const [base, ext = \"\"] = orig.split(/(\\.([\\w\\d-]+)$)/);\n\n const paramBase = (regex: RegExp) => {\n const name = base.replace(regex, \"$1\") || base;\n return {\n name,\n const: /\\W/.test(name)\n ? [name.replace(/\\W/g, \"_\"), crc(orig)].join(\"_\")\n : name,\n };\n };\n\n let param: PathToken[\"param\"] | undefined;\n\n if (base.startsWith(\"[\")) {\n // order is highly important!\n if (restParamRegex.test(base)) {\n param = {\n ...paramBase(restParamRegex),\n isRequired: false,\n isOptional: false,\n isRest: true,\n };\n } else if (optionalParamRegex.test(base)) {\n param = {\n ...paramBase(optionalParamRegex),\n isRequired: false,\n isOptional: true,\n isRest: false,\n };\n } else if (requiredParamRegex.test(base)) {\n param = {\n ...paramBase(requiredParamRegex),\n isRequired: true,\n isOptional: false,\n isRest: false,\n };\n }\n }\n\n return {\n orig,\n base,\n path: i === 0 ? orig.replace(/^index$/, \"/\") : orig,\n ext,\n ...(param ? { param } : {}),\n } satisfies PathToken;\n });\n};\n\n/**\n * Sort routes so that more specific (static) paths come before dynamic ones.\n *\n * This is important because dynamic segments\n * (e.g., `:id` or `*catchall`) are more general,\n * and can match values that should be routed to more specific static paths.\n *\n * For example, given:\n * - `/users/account`\n * - `/users/:id`\n *\n * If `/users/:id` comes first, visiting `/users/account` would incorrectly match it,\n * treating \"account\" as an `id`. So static routes must take precedence.\n * */\nexport const sortRoutes = (\n a: Pick<RouteEntry, \"name\" | \"pathTokens\">,\n b: Pick<RouteEntry, \"name\" | \"pathTokens\">,\n) => {\n const aStaticSegments = staticSegments(a.pathTokens);\n const bStaticSegments = staticSegments(b.pathTokens);\n\n // First: compare static segments (more static = higher priority)\n if (aStaticSegments !== bStaticSegments) {\n return bStaticSegments - aStaticSegments;\n }\n\n // Second: compare depth (shallower = higher priority)\n if (a.pathTokens.length !== b.pathTokens.length) {\n return a.pathTokens.length - b.pathTokens.length;\n }\n\n // Third: alphabetical for consistency\n return a.name.localeCompare(b.name);\n};\n\nconst staticSegments = (pathTokens: Array<PathToken>) => {\n return pathTokens.reduce((a, e) => a + (e.param ? 0 : 1), 0);\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#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", "import { basename } from \"node:path\";\n\nimport type { NestedRouteEntry, RouteEntry } from \"@/types\";\n\nimport { sortRoutes } from \"./base\";\nimport { PAGE_INDEX_BASENAME, PAGE_LAYOUT_BASENAME } from \"./resolve\";\n\nexport * from \"./base\";\n\nexport const nestedRoutesFactory = (routeEntries: Array<RouteEntry>) => {\n const entryStack = structuredClone(routeEntries).sort(sortRoutes);\n\n /**\n * Group entries by name (at the same level, both layout and index share same name).\n *\n * Handle 3 cases:\n * - both index and layout exists\n * - only index exists\n * - only layout exists\n *\n * */\n const transformEntries = (\n entries: Array<RouteEntry>,\n parent?: RouteEntry,\n ): Array<NestedRouteEntry> => {\n return [...new Set(entries.map((e) => e.name))].flatMap((name) => {\n const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {\n return entry.name === name ? [entry] : [];\n });\n\n const index = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_INDEX_BASENAME),\n ) as RouteEntry;\n\n const layout = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_LAYOUT_BASENAME),\n ) as RouteEntry;\n\n if (index || layout) {\n return [\n {\n index: index\n ? {\n ...index,\n pathTokens: index.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n layout: layout\n ? {\n ...layout,\n pathTokens: layout.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n parent: parent?.name,\n children: transformEntries(\n findDescendantEntries(index || layout),\n index || layout,\n ),\n },\n ];\n }\n\n return [];\n });\n };\n\n /**\n * Recursively finds direct descendant routes.\n *\n * \"Direct\" means the next existing route in the path hierarchy,\n * skipping intermediate path segments that don't have index/layout files.\n *\n * Example: blog/post/[slug]/index.tsx is a direct child of blog/index.tsx\n * even though \"post\" segment exists (it has no index.tsx).\n * */\n const findDescendantEntries = ({\n name,\n pathTokens,\n }: RouteEntry): Array<RouteEntry> => {\n // Find all potential children - BOTH indexes AND layouts\n const potentialChildren = entryStack.filter((entry) => {\n // Must be deeper than current entry\n if (entry.pathTokens.length <= pathTokens.length) {\n return false;\n }\n // Must be a descendant path\n if (!entry.name.startsWith(`${name}/`)) {\n return false;\n }\n return true;\n });\n\n // Filter to direct children (no intermediate route between parent and child)\n return potentialChildren.filter((child) => {\n // Check if any route exists between parent and child\n const hasIntermediateRoute = potentialChildren.some((intermediate) => {\n if (intermediate === child) {\n return false;\n }\n // Intermediate must be between parent and child in depth\n if (intermediate.pathTokens.length <= pathTokens.length) {\n return false;\n }\n if (intermediate.pathTokens.length >= child.pathTokens.length) {\n return false;\n }\n // Child must be descendant of intermediate\n return child.name.startsWith(`${intermediate.name}/`);\n });\n\n return !hasIntermediateRoute;\n });\n };\n\n // Find root entries - entries that have no parent route\n const rootEntries = entryStack.filter((entry) => {\n // Check if any other entry could be its parent\n const hasParent = entryStack.some((potential) => {\n if (potential === entry) {\n return false;\n }\n if (potential.pathTokens.length >= entry.pathTokens.length) {\n return false;\n }\n return entry.name.startsWith(`${potential.name}/`);\n });\n\n return !hasParent;\n });\n\n return transformEntries(rootEntries);\n};\n", "import { defaults } from \"@/defaults\";\nimport type { PluginOptionsResolved, RouteEntry } from \"@/types\";\n\nimport {\n apiRouteResolverFactory,\n apiUseResolverFactory,\n createRouteEntry,\n isApiRoute,\n isApiUse,\n isPageLayout,\n isPageRoute,\n pageLayoutResolverFactory,\n pageRouteResolverFactory,\n type ResolverSignature,\n scanRoutes,\n} from \"./resolve\";\n\nexport * from \"./nesting\";\nexport * from \"./resolve\";\n\nexport const routesFactory = async (pluginOptions: PluginOptionsResolved) => {\n const { appRoot, sourceFolder } = pluginOptions;\n\n const apiRouteResolver = apiRouteResolverFactory(pluginOptions);\n const apiUseResolver = apiUseResolverFactory(pluginOptions);\n const pageRouteResolver = pageRouteResolverFactory(pluginOptions);\n const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);\n\n const resolversFactory = (routeFiles: Array<string>) => {\n const resolvers = new Map<\n string, // fileFullpath\n ResolverSignature\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((file) => {\n const entry = createRouteEntry(file, pluginOptions);\n return entry ? [entry] : [];\n });\n\n for (const entry of entries) {\n if (entry.folder === defaults.apiDir) {\n if (isApiRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, apiRouteResolver(entry));\n } else if (isApiUse(entry.file)) {\n resolvers.set(entry.fileFullpath, apiUseResolver(entry));\n }\n } else if (entry.folder === defaults.pagesDir) {\n if (isPageRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, pageRouteResolver(entry));\n } else if (isPageLayout(entry.file)) {\n resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));\n }\n }\n }\n\n return resolvers;\n };\n\n const routeFiles = await scanRoutes({ appRoot, sourceFolder });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { App } from \"@kosmojs/api\";\n\nimport { defaults } from \"@/defaults\";\nimport { pathResolver } from \"@/paths\";\nimport type { PluginOptionsResolved } from \"@/types\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n const { createPath } = pathResolver({ appRoot, sourceFolder });\n\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let app: App;\n let devMiddlewareFactory: Function | undefined;\n let teardownHandler: Function | undefined;\n\n const watcher = async () => {\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (app) {\n await teardownHandler?.(app);\n }\n try {\n const exports = await import(`${outDir}/app.js?${Date.now()}`);\n devMiddlewareFactory = exports.devMiddlewareFactory;\n teardownHandler = exports.teardownHandler;\n app = await exports.default();\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n logLevel: \"error\",\n bundle: true,\n entryPoints: [createPath.api(\"app.ts\")],\n plugins: [rebuildPlugin],\n outdir: outDir,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n viteHandler: () => void,\n ) => {\n const next = () => {\n return viteHandler();\n };\n if (devMiddlewareFactory) {\n const handler = devMiddlewareFactory(app);\n await handler(req, res, next);\n } else {\n !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url)\n ? next() // do not await here\n : await app?.callback()(req, res);\n }\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import ora from \"ora\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = ora().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.fail();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { readFile } from \"node:fs/promises\";\n\nimport { parse as dotenv } from \"dotenv\";\nimport type { Plugin } from \"vite\";\n\nimport { pathExists } from \"@/fs\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const fileExists = file //\n ? await pathExists(file)\n : false;\n\n const env = fileExists\n ? dotenv(await readFile(file as never, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n", "import type { PluginOptionsResolved } from \"./types\";\n\nexport const typeboxLiteralText = (\n text: string,\n options: Pick<PluginOptionsResolved, \"refineTypeName\">,\n) => {\n return [\n // Escape backticks for safe use in template literals\n [/(?<!\\\\)`/g, \"\\\\`\"],\n // Escape $ for safe use in template literals\n [/(?<!\\\\)\\$\\{/g, \"\\\\${\"],\n /**\n * TypeBox's built-in `Options` type is not configurable.\n * To allow a custom type name, exposing `refineTypeName` option,\n * defaulted to TRefine, then renaming it to `Options`.\n * */\n [new RegExp(`\\\\b${options.refineTypeName}\\\\s*<`, \"g\"), \"Options<\"],\n ].reduce((text, [a, b]) => text.replace(a, b as never), text);\n};\n"],
5
- "mappings": "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",
6
- "names": ["paths", "basename", "join", "resolve", "styleText", "dirname", "join", "resolve", "crc", "glob", "join", "context", "join", "crc", "callExpression", "mkdir", "readFile", "writeFile", "dirname", "resolve", "crc", "dirname", "readFile", "mkdir", "writeFile", "hash", "resolve", "crc", "crc", "glob", "resolve", "join", "dirname", "crc", "entry", "id", "routeFiles", "join", "resolve", "join", "resolve", "resolve", "styleText", "join", "basename", "readFile", "readFile", "text"]
3
+ "sources": ["../src/alias-plugin/index.ts", "../src/paths.ts", "../src/defaults.ts", "../src/base-plugin/index.ts", "../src/routes-factory/resolve.ts", "../src/ast.ts", "../src/cache.ts", "../src/fs.ts", "../src/render.ts", "../src/routes-factory/base.ts", "../src/routes-factory/templates/resolved-types.hbs", "../src/routes-factory/templates/types.hbs", "../src/routes-factory/nesting.ts", "../src/routes-factory/index.ts", "../src/base-plugin/api-handler.ts", "../src/base-plugin/spinner.ts", "../src/define-plugin/index.ts", "../src/typebox.ts"],
4
+ "sourcesContent": ["import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nimport { createTsconfigPaths } from \"../paths\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const paths: Record<string, Array<string>> = await import(\n `${appRoot}/tsconfig.json`,\n { with: { type: \"json\" } }\n ).then((e) => {\n return {\n ...e.default.compilerOptions?.paths,\n ...createTsconfigPaths(\".\"),\n };\n });\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries(paths);\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { join } from \"node:path\";\n\nimport { defaults } from \"./defaults\";\n\ntype CreateImport = Record<\n | \"coreApi\"\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"lib\"\n | \"libApi\"\n | \"libEntry\",\n (...a: Array<string>) => string\n>;\n\nexport const createTsconfigPaths = (prefix: string) => {\n return {\n [`${defaults.appPrefix}/*`]: [`${prefix}/*`],\n [`${defaults.srcPrefix}/*`]: [`${prefix}/${defaults.srcDir}/*`],\n [`${defaults.libPrefix}/*`]: [\n `${prefix}/${defaults.libDir}/${defaults.srcDir}/*`,\n ],\n };\n};\n\nexport const pathResolver = ({\n appRoot,\n sourceFolder,\n}: {\n appRoot?: string;\n sourceFolder: string;\n}): {\n createPath: Record<\n | \"coreApi\"\n | \"src\"\n | \"config\"\n | \"api\"\n | \"pages\"\n | \"entry\"\n | \"lib\"\n | \"libApi\"\n | \"libEntry\"\n | \"libPages\",\n (...a: Array<string>) => string\n >;\n createImport: CreateImport;\n createImportHelper: (k: keyof CreateImport, ...a: Array<string>) => string;\n} => {\n const createPath = (...a: Array<string>) => {\n return appRoot ? join(appRoot, ...a) : join(...a);\n };\n\n const createImport: CreateImport = {\n coreApi(...a) {\n return join(defaults.appPrefix, defaults.coreDir, defaults.apiDir, ...a);\n },\n src(...a) {\n return join(defaults.srcPrefix, sourceFolder, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n lib(...a) {\n return join(defaults.libPrefix, sourceFolder, ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n };\n\n return {\n createPath: {\n coreApi(...a) {\n return createPath(defaults.coreDir, defaults.apiDir, ...a);\n },\n src(...a) {\n return createPath(defaults.srcDir, sourceFolder, ...a);\n },\n api(...a) {\n return this.src(defaults.apiDir, ...a);\n },\n pages(...a) {\n return this.src(defaults.pagesDir, ...a);\n },\n config(...a) {\n return this.src(defaults.configDir, ...a);\n },\n entry(...a) {\n return this.src(defaults.entryDir, ...a);\n },\n lib(...a) {\n return createPath(defaults.libDir, defaults.srcDir, sourceFolder, ...a);\n },\n libApi(...a) {\n return this.lib(defaults.apiDir, ...a);\n },\n libEntry(...a) {\n return this.lib(defaults.entryDir, ...a);\n },\n libPages(...a) {\n return this.lib(defaults.pagesDir, ...a);\n },\n },\n createImport,\n createImportHelper: (key, ...a) => {\n // Handlebars always appends an options object as the last argument,\n // slice it off before passing args to createImport\n return createImport[key](...a.slice(0, -1));\n },\n };\n};\n", "export const defaults = {\n appPrefix: \"~\",\n srcPrefix: \"@\",\n libPrefix: \"_\",\n\n coreDir: \"core\",\n srcDir: \"src\",\n libDir: \"lib\",\n\n configDir: \"config\",\n apiDir: \"api\",\n pagesDir: \"pages\",\n entryDir: \"entry\",\n fetchDir: \"fetch\",\n};\n", "import { writeFile } from \"node:fs/promises\";\nimport { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\n// NOTE: keep this as an external export for workers to be able to load it!\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\n\nimport { routesFactory } from \"../routes-factory\";\nimport type { PluginOptions, PluginOptionsResolved } from \"../types\";\nimport apiHandlerFactory from \"./api-handler\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators) can't be passed to worker threads.\n const { generators = [], ...restOptions } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"../..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const { generators = [], refineTypeName = \"TRefine\" } = {\n ...pluginOptions,\n };\n\n const apiGenerator = generators.find((e) => e.slot === \"api\");\n const fetchGenerator = generators.find((e) => e.slot === \"fetch\");\n const ssrGenerator = generators.find((e) => e.slot === \"ssr\");\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n ...(apiGenerator ? [apiGenerator] : []),\n // 3. then fetch generator, only if api generator also enabled\n ...(fetchGenerator && apiGenerator ? [fetchGenerator] : []),\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.slot //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.slot)\n : true;\n }),\n // 5. ssr generator should run last\n ...(ssrGenerator ? [ssrGenerator] : []),\n ],\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n const packageJsonFile = resolve(appRoot, \"package.json\");\n\n const packageJson = await import(packageJsonFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const newDependencies: Array<\n [\"dependencies\" | \"devDependencies\", string, string]\n > = [];\n\n for (const generator of store.resolvedOptions.generators) {\n for (const key of [\"dependencies\", \"devDependencies\"] as const) {\n for (const [pkg, ver] of Object.entries(generator[key] || {})) {\n if (!packageJson[key]?.[pkg]) {\n newDependencies.push([key, pkg, ver]);\n }\n }\n }\n }\n\n if (newDependencies.length) {\n console.warn();\n console.warn(\n [\n \"\uD83D\uDCA1 \",\n styleText([\"bold\", \"italic\", \"red\"], \"New dependencies added: \"),\n styleText(\"dim\", newDependencies.map(([, pkg]) => pkg).join(\", \")),\n ].join(\"\"),\n );\n console.warn(\n \"\uD83D\uDCE6\",\n [\n styleText(\n [\"bold\", \"blueBright\"],\n store.config.command === \"build\"\n ? \"Install them and run a new build: \"\n : \"Install them and restart dev server: \",\n ),\n styleText(\n \"dim\",\n [\"npm\", \"pnpm\", \"yarn\"]\n .map((e) => `\\`${e} install\\``)\n .join(\" / \"),\n ),\n ].join(\"\"),\n );\n console.warn();\n\n for (const [key, pkg, ver] of newDependencies) {\n packageJson[key] = { ...packageJson[key], [pkg]: ver };\n }\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJson, null, 2),\n \"utf8\",\n );\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedEntries = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedEntries.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { build } = await factory(store.resolvedOptions);\n await build(resolvedEntries);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n if (!store.resolvedOptions.generators.find((e) => e.slot === \"api\")) {\n const stopWorker = workerHandler(() => stopWorker());\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport mimeTypes from \"mime-types\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"../ast\";\nimport { cacheFactory } from \"../cache\";\nimport { defaults } from \"../defaults\";\nimport { pathResolver } from \"../paths\";\nimport { render, renderToFile } from \"../render\";\nimport type {\n ApiRoute,\n PageRoute,\n PathTokenParamPart,\n PluginOptionsResolved,\n ResolvedEntry,\n RouteEntry,\n ValidationDefinition,\n} from \"../types\";\nimport { pathTokensFactory } from \"./base\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type ResolverSignature = {\n name: string;\n handler: (updatedFile?: string) => Promise<ResolvedEntry>;\n};\n\nexport const API_INDEX_BASENAME = \"index\";\nexport const API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;\n\nexport const API_USE_BASENAME = \"use\";\nexport const API_USE_PATTERN = `${API_USE_BASENAME}.ts`;\n\nexport const PAGE_INDEX_BASENAME = \"index\";\nexport const PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;\n\nexport const PAGE_LAYOUT_BASENAME = \"layout\";\nexport const PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;\n\nconst ROUTE_FILE_PATTERNS = [\n // match index files in api dir\n `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n // match use files in api dir\n `${defaults.apiDir}/**/${API_USE_PATTERN}`,\n // match index files in pages dir\n `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n // match layout files in pages dir\n `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`,\n];\n\nexport const scanRoutes = async ({\n appRoot,\n sourceFolder,\n}: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">) => {\n const { createPath } = pathResolver({ appRoot, sourceFolder });\n return glob(ROUTE_FILE_PATTERNS, {\n cwd: createPath.src(),\n absolute: true,\n onlyFiles: true,\n followSymbolicLinks: false,\n ignore: [\n // ignore top-level matches, routes resides in folders, even index route\n `${defaults.apiDir}/${API_INDEX_PATTERN}`,\n `${defaults.apiDir}/${API_USE_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`,\n ],\n });\n};\n\nexport const isRouteFile = (\n file: string,\n {\n appRoot,\n sourceFolder,\n }: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n):\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | false => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/${defaults.srcDir}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n * */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return false;\n }\n\n return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS)\n ? [folder, rest.join(\"/\")]\n : false;\n};\n\nexport const isApiRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);\n};\n\nexport const isApiUse = (file: string) => {\n return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);\n};\n\nexport const isPageRoute = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);\n};\n\nexport const isPageLayout = (file: string) => {\n return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);\n};\n\nexport const createRouteEntry = (\n fileFullpath: string,\n {\n appRoot,\n sourceFolder,\n }: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n): RouteEntry | undefined => {\n // scanner already is doing a great job on matching only relevant files\n // but doing a double check here to make sure only needed files added to stack\n const resolvedPaths = isRouteFile(fileFullpath, { appRoot, sourceFolder });\n\n if (!resolvedPaths) {\n return;\n }\n\n const [folder, file] = resolvedPaths;\n\n const id = `${file.replace(/\\W+/g, \"_\")}_${crc(file)}`;\n const name = dirname(file);\n\n try {\n const [pathTokens, pathPattern] = pathTokensFactory(dirname(file));\n return { id, name, folder, file, fileFullpath, pathTokens, pathPattern };\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n console.error(\n `\u2757${styleText(\"red\", \"ERROR\")}: Failed parsing path for \"${styleText(\"cyan\", file)}\"`,\n );\n console.error(error);\n return;\n }\n};\n\ntype ResolverFactory = (\n pluginOptions: PluginOptionsResolved,\n) => (entry: RouteEntry) => ResolverSignature;\n\nexport const pageLayoutResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"pageLayout\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const pageRouteResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { id, name, folder, file, fileFullpath, pathTokens, pathPattern } =\n entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n const entry: PageRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n params: {\n schema: pathTokens.flatMap((e) => {\n return e.parts.filter((p) => p.type === \"param\");\n }),\n },\n folder,\n file,\n fileFullpath,\n };\n\n return {\n kind: \"pageRoute\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const apiUseResolverFactory: ResolverFactory = () => {\n return (entry) => {\n const { name } = entry;\n\n const handler: ResolverSignature[\"handler\"] = async () => {\n return {\n kind: \"apiUse\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n\nexport const apiRouteResolverFactory: ResolverFactory = (pluginOptions) => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n refineTypeName,\n } = pluginOptions;\n\n const resolveTypes = generators.some((e) => e.options?.resolveTypes);\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n return ({\n id,\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n pathPattern,\n }) => {\n const handler: ResolverSignature[\"handler\"] = async (updatedFile) => {\n const paramsSchema: Array<PathTokenParamPart> = pathTokens.flatMap(\n (e) => {\n return e.parts.flatMap((p) => {\n return p.type === \"param\" ? [p] : [];\n });\n },\n );\n\n const optionalParams = paramsSchema.length\n ? paramsSchema.filter((e) => e.kind === \"required\").length === 0\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { id, file, fileFullpath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n validationDefinitions,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { id, name, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const validationTypes = validationDefinitions.flatMap<{\n id: string;\n text: string;\n }>((def) => {\n return def.target === \"response\"\n ? def.variants.flatMap(({ id, body }) => {\n return body ? [{ id, text: body }] : [];\n })\n : [def.schema];\n });\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({\n appRoot,\n sourceFolder,\n }).createPath.libApi(dirname(file), \"types.ts\");\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n isRequired: param.kind === \"required\",\n isSplat: param.kind === \"splat\",\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n validationTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n stripComments: true,\n overrides: { [refineTypeName]: refineTypeName },\n withProperties: [\n params.id,\n ...validationTypes.flatMap(({ id }) => id),\n ],\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n referencedFiles,\n validationDefinitions: validationDefinitions.map((def) => {\n return {\n ...def,\n ...(def.target === \"response\"\n ? {\n variants: def.variants.map((variant) => {\n return {\n ...variant,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === variant.id,\n ),\n };\n }),\n }\n : {\n schema: {\n ...def.schema,\n resolvedType: resolvedTypes?.find(\n (e) => e.name === def.schema.id,\n ),\n },\n }),\n };\n }),\n });\n }\n\n const validationDefinitions = cache.validationDefinitions.flatMap(\n (def) => {\n let augmentedDef: ValidationDefinition | undefined = def;\n\n if (def.target === \"response\") {\n augmentedDef = {\n ...def,\n variants: def.variants.flatMap((variant, i) => {\n if (typeof variant.contentType !== \"string\") {\n return [variant];\n }\n\n if (variant.contentType.includes(\"/\")) {\n return [variant];\n }\n\n const contentType = mimeTypes.lookup(variant.contentType);\n\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${variant.contentType}`,\n );\n console.warn(\n styleText(\n [\"cyan\"],\n ` Response variant #${i} excluded from route schemas`,\n ),\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n return [];\n }\n\n return [{ ...variant, contentType }];\n }),\n };\n } else if (def.contentType && !def.contentType.includes(\"/\")) {\n const contentType = mimeTypes.lookup(def.contentType);\n if (contentType === false) {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n \"\u2717 Failed resolving Response Content Type\",\n ),\n );\n console.warn(\n ` Invalid value provided for mime-types lookup - ${def.contentType}`,\n );\n console.warn(` Route: ${name}; Method: ${def.method}`);\n console.warn();\n } else {\n augmentedDef = { ...def, contentType };\n }\n }\n\n return augmentedDef ? [augmentedDef] : [];\n },\n );\n\n const entry: ApiRoute = {\n id,\n name,\n pathTokens,\n pathPattern,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n validationDefinitions,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"apiRoute\",\n entry,\n };\n };\n\n return { name, handler };\n };\n};\n", "import { resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n type TypeNode,\n} from \"ts-morph\";\n\nimport {\n type HTTPMethod,\n HTTPMethods,\n RequestValidationTargets,\n type ValidationTarget,\n} from \"@kosmojs/api\";\n\nimport type {\n ApiRoute,\n PluginOptionsResolved,\n TypeDeclaration,\n ValidationDefinition,\n} from \"./types\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"id\" | \"name\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(route, defaultExport)\n : [];\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n validationDefinitions: methods.flatMap((e) => e.validationDefinitions),\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n): Array<{ index: number; text: string }> | undefined => {\n const [\n _routeName, // first generic - the route name\n paramsGeneric, // second generic - params refinements\n ] = extractGenerics(callExpression);\n\n if (!paramsGeneric?.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n return paramsGeneric.getElements().map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n callExpression: CallExpression,\n): Array<{\n method: HTTPMethod;\n validationDefinitions: Array<ValidationDefinition>;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods: ReturnType<typeof extractRouteMethods> = [];\n\n for (const [callExpression, method] of callExpressions) {\n const [vDefs, vOpts] = extractGenerics(callExpression);\n methods.push({\n method,\n validationDefinitions: extractValidationDefinitions(\n route,\n method,\n vDefs,\n vOpts,\n ),\n });\n }\n\n return methods;\n};\n\n/** Parse a boolean literal type node */\nconst parseRuntimeValidation = (typeNode: TypeNode) => {\n if (typeNode.isKind(SyntaxKind.LiteralType)) {\n const literal = typeNode.getFirstChild();\n if (literal?.isKind(SyntaxKind.TrueKeyword)) {\n return true;\n } else if (literal?.isKind(SyntaxKind.FalseKeyword)) {\n return false;\n }\n }\n return undefined;\n};\n\nconst extractResponseVariant = (\n typeNode: TypeNode,\n):\n | {\n status: number;\n contentType?: string | undefined;\n body?: string | undefined;\n }\n | undefined => {\n if (!typeNode.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n let status = 200; // default\n let contentType: string | undefined;\n let body: string | undefined;\n\n const [statusNode, contentTypeNode, bodyNode] = typeNode.getElements();\n\n // Status (index 0) - should be a LiteralType with NumericLiteral\n if (statusNode?.isKind(SyntaxKind.LiteralType)) {\n const literal = statusNode.getFirstChildByKind(SyntaxKind.NumericLiteral);\n if (literal) {\n status = Number(literal.getText());\n }\n }\n\n // ContentType (index 1) - should be a LiteralType with StringLiteral\n if (contentTypeNode) {\n contentType = extractStringLiteral(contentTypeNode);\n }\n\n // Response type text (index 2)\n if (bodyNode) {\n body = bodyNode.getText();\n if ([\"object\"].includes(body)) {\n body = \"{}\";\n }\n }\n\n return { status, contentType, body };\n};\n\n/** Parse opts TypeLiteral into a map keyed by target */\nconst parseValidationOptions = (typeNode: TypeNode | undefined) => {\n const opts: Partial<\n Record<\n ValidationTarget,\n {\n contentType: string | undefined;\n runtimeValidation: boolean | undefined;\n customErrors: Record<string, string> | undefined;\n }\n >\n > = {};\n\n if (!typeNode?.isKind(SyntaxKind.TypeLiteral)) {\n return opts;\n }\n\n for (const prop of typeNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (!typeNode.isKind(SyntaxKind.TypeLiteral)) {\n continue;\n }\n\n let contentType: string | undefined;\n let runtimeValidation: boolean | undefined;\n const customErrors: Record<string, string> = {};\n\n for (const member of typeNode.getMembers()) {\n if (!member.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const nameNode = member.getNameNode();\n const valueNode = member.getTypeNodeOrThrow();\n\n const name = nameNode.isKind(SyntaxKind.StringLiteral)\n ? nameNode.getLiteralText() // No quotes\n : nameNode.getText(); // Regular identifier\n\n if (name === \"contentType\") {\n contentType = extractStringLiteral(valueNode);\n } else if (name === \"runtimeValidation\") {\n runtimeValidation = parseRuntimeValidation(valueNode);\n } else if (name.startsWith(\"error\")) {\n const literal = extractStringLiteral(valueNode);\n if (literal) {\n customErrors[name] = literal;\n }\n }\n }\n\n opts[target] = {\n contentType,\n runtimeValidation,\n customErrors,\n };\n }\n\n return opts;\n};\n\nconst extractStringLiteral = (typeNode: TypeNode) => {\n const literal = typeNode.isKind(SyntaxKind.LiteralType)\n ? typeNode.getFirstChildByKind(SyntaxKind.StringLiteral)\n : undefined;\n return literal ? literal.getLiteralText() : undefined;\n};\n\n/**\n * Extract validation definitions from route handler generics.\n * Merges defs (schemas) and opts (validation options) into a flat array.\n * */\nexport const extractValidationDefinitions = (\n route: Pick<ApiRoute, \"id\" | \"name\">,\n method: HTTPMethod,\n defsNode: TypeNode,\n optsNode: TypeNode | undefined,\n) => {\n const definitions: Array<ValidationDefinition> = [];\n\n if (!defsNode?.isKind(SyntaxKind.TypeLiteral)) {\n return definitions;\n }\n\n const optsMap = parseValidationOptions(optsNode);\n\n const createId = (target: string, hash?: string) => {\n return [\n target.replace(/^./, (c) => c.toUpperCase()),\n \"T\",\n method,\n crc(route.id + hash),\n ].join(\"\");\n };\n\n for (const prop of defsNode.getMembers()) {\n if (!prop.isKind(SyntaxKind.PropertySignature)) {\n continue;\n }\n\n const target = prop.getName() as ValidationTarget;\n const typeNode = prop.getTypeNodeOrThrow();\n\n if (target === \"response\") {\n const variants = typeNode.isKind(SyntaxKind.UnionType)\n ? typeNode.getChildrenOfKind(SyntaxKind.TupleType)\n : [typeNode];\n definitions.push({\n ...optsMap[target],\n method,\n target,\n variants: variants.flatMap((e, i) => {\n const { status, contentType, body } = extractResponseVariant(e) || {};\n\n if (!status) {\n return [];\n }\n\n if (contentType && typeof contentType !== \"string\") {\n console.warn(\n styleText(\n [\"bold\", \"red\"],\n `\u2717 The second element of a response variant should specify the Response Content Type`,\n ),\n );\n console.warn(\n styleText([\"blue\"], ` Example: [200, \"json\", Schema]`),\n );\n console.warn(\n ` Route: ${route.name}; Method: ${method}; Response Variant: #${i}`,\n );\n console.warn();\n }\n\n return [\n {\n id: createId(target, JSON.stringify([status, contentType, body])),\n status,\n contentType,\n body,\n },\n ];\n }),\n });\n } else if (Object.keys(RequestValidationTargets).includes(target)) {\n definitions.push({\n ...optsMap[target],\n method,\n target,\n schema: {\n id: createId(target),\n text: typeNode.getText(),\n },\n });\n }\n }\n\n return definitions;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (callExpression: CallExpression) => {\n return callExpression.getTypeArguments();\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\n\nimport { pathExists } from \"./fs\";\nimport { pathResolver } from \"./paths\";\nimport type { ApiRoute } from \"./types\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"numericParams\"\n | \"typeDeclarations\"\n | \"validationDefinitions\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"id\" | \"file\" | \"fileFullpath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).createPath.libApi(dirname(route.file), \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "import { access, constants } from \"node:fs/promises\";\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport handlebars from \"handlebars\";\n\nimport { pathExists } from \"./fs\";\nimport type { PageRoute } from \"./types\";\n\nexport type RenderOptions = {\n noEscape?: boolean;\n // handlebars instance\n renderer?: typeof handlebars;\n};\n\nexport type FactoryOptions = RenderOptions & {\n /**\n * Controls whether to overwrite an existing file.\n * - `false`: skip writing if the file already exists\n * - `true` (default): always overwrite\n * - function: custom logic to decide whether to overwrite, based on current file content\n */\n overwrite?: boolean | ((fileContent: string) => boolean);\n};\n\nexport const render = <Context = object>(\n template: string,\n context: Context,\n options?: RenderOptions,\n): string => {\n const { noEscape = true, renderer = handlebars } = { ...options };\n return renderer.compile(template, { noEscape })(context);\n};\n\nexport const renderToFile = async <Context = object>(\n file: string,\n template: string,\n context: Context,\n options?: FactoryOptions,\n): Promise<void> => {\n const content = render(template, context, options);\n\n /**\n * Two fs calls (exists + read) are worth it to avoid touching the file\n * and triggering watchers unnecessarily.\n * */\n if (await pathExists(file)) {\n const { overwrite = true } = { ...options };\n if (overwrite === false) {\n return;\n }\n const fileContent = await readFile(file, \"utf8\");\n if (typeof overwrite === \"function\" && !overwrite(fileContent)) {\n return;\n }\n if (crc(content) === crc(fileContent)) {\n return;\n }\n }\n\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, content, \"utf8\");\n};\n\nexport const renderFactory = (\n options?: FactoryOptions & {\n outdir?: string;\n partials?: Record<string, string>;\n helpers?: Record<string, (...a: Array<never>) => unknown>;\n },\n) => {\n const renderer = handlebars.create();\n\n renderer.registerPartial({ ...options?.partials } as never);\n\n renderer.registerHelper({ ...options?.helpers } as never);\n\n return {\n render<Context = object>(\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return render(template, context, {\n renderer,\n ...options,\n ...selfOoptions,\n });\n },\n async renderToFile<Context = object>(\n file: string,\n template: string,\n context: Context,\n selfOoptions?: FactoryOptions,\n ) {\n return renderToFile(\n options?.outdir ? join(options.outdir, file) : file,\n template,\n context,\n { renderer, ...options, ...selfOoptions },\n );\n },\n };\n};\n\nexport const renderHelpers = {\n createParamsLiteral: (params: PageRoute[\"params\"]) => {\n return params.schema\n .map((p) => {\n return p.kind === \"splat\"\n ? `${p.const}?: Array<string | number>`\n : p.kind === \"optional\"\n ? `${p.const}?: string | number`\n : `${p.const}: string | number`;\n })\n .join(\", \");\n },\n};\n", "import crc from \"crc/crc32\";\nimport { parse, type Token } from \"path-to-regexp\";\n\nimport type {\n PathToken,\n PathTokenParamPart,\n PathTokenStaticPart,\n RouteEntry,\n} from \"../types\";\n\n/**\n * Parse a filesystem route path into structured PathToken array.\n *\n * Uses path-to-regexp v8 AST for parsing, with directory-friendly syntax:\n * - [param] => required param - :param\n * - {param} => optional param - {:param}\n * - {...param} => splat - {*param}\n *\n * Direct :param syntax is prohibited outside {} to avoid ambiguity.\n * Inside {} it is treated as path-to-regexp power syntax and used as-is.\n *\n * Examples:\n * Required: [id], [name]\n * Optional: {name}, {format}\n * Splat: {...path}\n * Mixed segments: shop/[id]-{name}\n * Power syntax: {-v:version{-:pre}}, :name{@:version{.:min}}.js\n * */\nexport const pathTokensFactory = (\n path: string,\n {\n transformStaticValue = normalizeStaticValue,\n }: {\n transformStaticValue?: (v: string) => string;\n } = {},\n): [tokens: Array<PathToken>, pattern: string] => {\n /**\n * Recursively extract parts from path-to-regexp AST tokens.\n * A param inside a group is optional; top-level params are required.\n * Wildcard tokens are always splat.\n * Slash-only text nodes (restored for parsing) are skipped.\n * */\n const extractParts = (\n tokens: Array<Token>,\n createConst: (value: string) => string,\n insideGroup = false,\n ): Array<PathTokenStaticPart | PathTokenParamPart> => {\n const parts: Array<PathTokenStaticPart | PathTokenParamPart> = [];\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n // Skip slash-only text nodes (restored it via transformers for parsing)\n if (token.value !== \"/\") {\n parts.push({\n type: \"static\",\n value: transformStaticValue(token.value),\n });\n }\n break;\n case \"param\":\n parts.push({\n type: \"param\",\n kind: insideGroup ? \"optional\" : \"required\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"wildcard\":\n parts.push({\n type: \"param\",\n kind: \"splat\",\n name: token.name,\n const: createConst(token.name),\n });\n break;\n case \"group\":\n parts.push(...extractParts(token.tokens, createConst, true));\n break;\n }\n }\n\n return parts;\n };\n\n const patternTransforms: Array<(s: string) => string> = [\n // Transform required params: [id] => :id\n // Only pure \\w param names,\n // [some-id] used as is, not treated as param,\n // use [some_id] instead.\n (s) => s.replace(/\\[(\\w+)\\]/g, \":$1\"),\n\n // Transform optional params: {id} => {:id}\n // Only pure \\w param names,\n // anything else treated as a path-to-regexp pattern and used as is.\n // {some-id} treated as an optional static segment.\n // use {some_id} for simple param syntax\n // or {:some-id} pattern where :some is the param name and -id is a static segment.\n (s) => s.replace(/\\{(\\w+)\\}/g, \"{:$1}\"),\n\n // Transform splat params: {...param} => {*param}\n (s) => s.replace(/\\{\\.\\.\\./g, \"{*\"),\n\n // Insert leading slash inside optional/splat groups.\n // {:name} => {/:name}\n // {*name} => {/*name}\n (s) => {\n return s.startsWith(\"{\") // keep this check for intention clarity\n ? s.replace(/^\\{/, \"{/\")\n : s;\n },\n ];\n\n // detect :param used outside {}\n const detectBareParams = (s: string): \":\" | string | undefined => {\n let depth = 0;\n for (const [i, ch] of [...s].entries()) {\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n } else if (ch === \":\" && depth === 0) {\n const match = s.slice(i + 1).match(/^\\w+/);\n return match?.[0] || \":\";\n }\n }\n return;\n };\n\n const tokens = path\n .replace(/^index\\/?/, \"\")\n .split(\"/\")\n .flatMap<PathToken>((orig) => {\n if (!orig.length) {\n return [];\n }\n\n const bareParam = detectBareParams(orig);\n\n if (bareParam === \":\") {\n throw new Error(\n `${path} contains colons outside braces, use : only within {}`,\n );\n } else if (bareParam) {\n throw new Error(\n `${path} contains bare params, use [${bareParam}] instead of :${bareParam}`,\n );\n }\n\n const pattern = patternTransforms.reduce((src, fn) => fn(src), orig);\n\n const { tokens } = parse(pattern);\n\n const parts = extractParts(tokens, (val) => {\n // Sanitize param name into a valid JS identifier\n return /\\W/.test(val) || /^\\d/.test(val)\n ? [val.replace(/^\\d+|\\W/g, \"_\"), crc(orig)].join(\"_\")\n : val;\n });\n\n const isStatic = parts.length === 1 ? parts[0].type === \"static\" : false;\n const isParam = parts.length === 1 ? parts[0].type === \"param\" : false;\n\n const kind: PathToken[\"kind\"] = isStatic\n ? \"static\"\n : isParam\n ? \"param\"\n : \"mixed\";\n\n return [\n {\n kind,\n orig,\n pattern,\n parts,\n },\n ];\n });\n\n return [\n tokens,\n tokens\n .map(({ pattern }, i) => {\n const next = tokens[i + 1];\n\n if (!next || next.pattern.includes(\"/\")) {\n return pattern;\n }\n\n const slashRequired = tokens.slice(i + 1).some((e) => {\n return e.parts.some((e) => {\n return e.type === \"static\" || e.kind === \"required\";\n });\n });\n\n return slashRequired ? `${pattern}/` : pattern;\n })\n .join(\"\"),\n ];\n};\n\nexport const normalizeStaticValue = (value: string) => {\n return value.replace(/\\+/g, \"\\\\\\\\+\");\n};\n\n/**\n * Sort routes so that more specific (static) paths come before dynamic ones.\n *\n * This is important because dynamic segments are more general,\n * and can match values that should be routed to more specific static paths.\n *\n * For example, given:\n * - `/users/account`\n * - `/users/[id]`\n *\n * If `/users/[id]` comes first, visiting `/users/account` would incorrectly match it,\n * treating \"account\" as an `id`. So static routes must take precedence.\n *\n * Specificity is calculated per segment with fixed weights:\n * - static segment: 4 (most specific, exact match)\n * - mixed segment: 3 (has both static and dynamic parts)\n * - required param: 2 (matches any single segment)\n * - optional param: 1 (may or may not match)\n * - splat param: 0 (matches anything, least specific)\n *\n * Fixed per-segment weights ensure that deeply nested mixed segments\n * never outscore multiple static segments.\n * */\nexport const sortRoutes = (\n a: Pick<RouteEntry, \"name\" | \"pathTokens\">,\n b: Pick<RouteEntry, \"name\" | \"pathTokens\">,\n): number => {\n const aSpecificity = routeSpecificity(a.pathTokens);\n const bSpecificity = routeSpecificity(b.pathTokens);\n\n // higher specificity = higher priority\n if (aSpecificity !== bSpecificity) {\n return bSpecificity - aSpecificity;\n }\n\n // at equal specificity, shallower = higher priority\n if (a.pathTokens.length !== b.pathTokens.length) {\n return a.pathTokens.length - b.pathTokens.length;\n }\n\n // deterministic tiebreaker\n return a.name.localeCompare(b.name);\n};\n\n/**\n * Weight of a single param part, used for pure param segments.\n * */\nconst paramWeight = (part: PathTokenParamPart): number => {\n return {\n required: 2,\n optional: 1,\n splat: 0,\n }[part.kind];\n};\n\nconst mixedSegmentWeight = (parts: PathToken[\"parts\"]): number => {\n const hasSplat = parts.some((p) => {\n return p.type === \"param\" ? p.kind === \"splat\" : false;\n });\n return hasSplat ? 0.5 : 3;\n};\n\n/**\n * Weight of a single path segment.\n *\n * Uses fixed values per segment kind to prevent\n * complex mixed segments from outscoring multiple statics.\n * */\nconst segmentWeight = (token: PathToken): number => {\n return {\n static: 4,\n mixed: mixedSegmentWeight(token.parts),\n param: paramWeight(token.parts[0] as PathTokenParamPart),\n }[token.kind];\n};\n\n/**\n * Total route specificity: sum of all segment weights.\n * */\nconst routeSpecificity = (pathTokens: Array<PathToken>): number => {\n return pathTokens.reduce((sum, token) => sum + segmentWeight(token), 0);\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}: {{#if refinement}}\n {{refinement.text}},\n {{else}}\n {{#if isSplat}}Array<string>{{else}}string{{/if}},\n {{/if}}\n {{/each}}\n};\n\n{{#each validationTypes}}export type {{id}} = {{text}};\n{{/each}}\n", "import { basename } from \"node:path\";\n\nimport type { NestedRouteEntry, RouteEntry } from \"../types\";\nimport { sortRoutes } from \"./base\";\nimport { PAGE_INDEX_BASENAME, PAGE_LAYOUT_BASENAME } from \"./resolve\";\n\nexport * from \"./base\";\n\nexport const nestedRoutesFactory = (routeEntries: Array<RouteEntry>) => {\n const entryStack = structuredClone(routeEntries).sort(sortRoutes);\n\n /**\n * Group entries by name (at the same level, both layout and index share same name).\n *\n * Handle 3 cases:\n * - both index and layout exists\n * - only index exists\n * - only layout exists\n *\n * */\n const transformEntries = (\n entries: Array<RouteEntry>,\n parent?: RouteEntry,\n ): Array<NestedRouteEntry> => {\n return [...new Set(entries.map((e) => e.name))].flatMap((name) => {\n const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {\n return entry.name === name ? [entry] : [];\n });\n\n const index = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_INDEX_BASENAME),\n ) as RouteEntry;\n\n const layout = nameEntries.find((e) =>\n basename(e.file).startsWith(PAGE_LAYOUT_BASENAME),\n ) as RouteEntry;\n\n if (index || layout) {\n return [\n {\n index: index\n ? {\n ...index,\n pathTokens: index.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n layout: layout\n ? {\n ...layout,\n pathTokens: layout.pathTokens.slice(\n parent?.pathTokens.length || 0,\n ),\n }\n : undefined,\n parent: parent?.name,\n children: transformEntries(\n findDescendantEntries(index || layout),\n index || layout,\n ),\n },\n ];\n }\n\n return [];\n });\n };\n\n /**\n * Recursively finds direct descendant routes.\n *\n * \"Direct\" means the next existing route in the path hierarchy,\n * skipping intermediate path segments that don't have index/layout files.\n *\n * Example: blog/post/[slug]/index.tsx is a direct child of blog/index.tsx\n * even though \"post\" segment exists (it has no index.tsx).\n * */\n const findDescendantEntries = ({\n name,\n pathTokens,\n }: RouteEntry): Array<RouteEntry> => {\n // Find all potential children - BOTH indexes AND layouts\n const potentialChildren = entryStack.filter((entry) => {\n // Must be deeper than current entry\n if (entry.pathTokens.length <= pathTokens.length) {\n return false;\n }\n // Must be a descendant path\n if (!entry.name.startsWith(`${name}/`)) {\n return false;\n }\n return true;\n });\n\n // Filter to direct children (no intermediate route between parent and child)\n return potentialChildren.filter((child) => {\n // Check if any route exists between parent and child\n const hasIntermediateRoute = potentialChildren.some((intermediate) => {\n if (intermediate === child) {\n return false;\n }\n // Intermediate must be between parent and child in depth\n if (intermediate.pathTokens.length <= pathTokens.length) {\n return false;\n }\n if (intermediate.pathTokens.length >= child.pathTokens.length) {\n return false;\n }\n // Child must be descendant of intermediate\n return child.name.startsWith(`${intermediate.name}/`);\n });\n\n return !hasIntermediateRoute;\n });\n };\n\n // Find root entries - entries that have no parent route\n const rootEntries = entryStack.filter((entry) => {\n // Check if any other entry could be its parent\n const hasParent = entryStack.some((potential) => {\n if (potential === entry) {\n return false;\n }\n if (potential.pathTokens.length >= entry.pathTokens.length) {\n return false;\n }\n return entry.name.startsWith(`${potential.name}/`);\n });\n\n return !hasParent;\n });\n\n return transformEntries(rootEntries);\n};\n", "import { defaults } from \"../defaults\";\nimport type { PluginOptionsResolved, RouteEntry } from \"../types\";\nimport {\n apiRouteResolverFactory,\n apiUseResolverFactory,\n createRouteEntry,\n isApiRoute,\n isApiUse,\n isPageLayout,\n isPageRoute,\n pageLayoutResolverFactory,\n pageRouteResolverFactory,\n type ResolverSignature,\n scanRoutes,\n} from \"./resolve\";\n\nexport * from \"./base\";\nexport * from \"./nesting\";\nexport * from \"./resolve\";\n\nexport const routesFactory = async (pluginOptions: PluginOptionsResolved) => {\n const { appRoot, sourceFolder } = pluginOptions;\n\n const apiRouteResolver = apiRouteResolverFactory(pluginOptions);\n const apiUseResolver = apiUseResolverFactory(pluginOptions);\n const pageRouteResolver = pageRouteResolverFactory(pluginOptions);\n const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);\n\n const resolversFactory = (routeFiles: Array<string>) => {\n const resolvers = new Map<\n string, // fileFullpath\n ResolverSignature\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((file) => {\n const entry = createRouteEntry(file, pluginOptions);\n return entry ? [entry] : [];\n });\n\n for (const entry of entries) {\n if (entry.folder === defaults.apiDir) {\n if (isApiRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, apiRouteResolver(entry));\n } else if (isApiUse(entry.file)) {\n resolvers.set(entry.fileFullpath, apiUseResolver(entry));\n }\n } else if (entry.folder === defaults.pagesDir) {\n if (isPageRoute(entry.file)) {\n resolvers.set(entry.fileFullpath, pageRouteResolver(entry));\n } else if (isPageLayout(entry.file)) {\n resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));\n }\n }\n }\n\n return resolvers;\n };\n\n const routeFiles = await scanRoutes({ appRoot, sourceFolder });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { DevSetup } from \"@kosmojs/api\";\n\nimport { defaults } from \"../defaults\";\nimport { pathResolver } from \"../paths\";\nimport type { PluginOptionsResolved } from \"../types\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n const { createPath } = pathResolver({ appRoot, sourceFolder });\n\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let devSetup: DevSetup | undefined;\n\n const watcher = async () => {\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (devSetup) {\n await devSetup.teardownHandler?.();\n }\n try {\n await import(`${outDir}/dev.js?${Date.now()}`).then((e) => {\n devSetup = e.default;\n });\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n define: {\n ...esbuildOptions.define,\n PRODUCTION_BUILD: \"false\",\n },\n logLevel: \"error\",\n bundle: true,\n entryPoints: [createPath.api(\"dev.ts\")],\n plugins: [rebuildPlugin],\n outdir: outDir,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n next: () => void | Promise<void>,\n ) => {\n const {\n requestMatcher = () => {\n return new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(\n req.url as string,\n );\n },\n requestHandler,\n } = { ...devSetup };\n\n if (!requestMatcher(req)) {\n return next();\n }\n\n const handler = requestHandler?.();\n return handler ? handler(req, res) : next();\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import { Spinner } from \"@topcli/spinner\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = new Spinner().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.failed();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { readFile } from \"node:fs/promises\";\n\nimport { parse as dotenv } from \"dotenv\";\nimport type { Plugin } from \"vite\";\n\nimport { pathExists } from \"../fs\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const fileExists = file //\n ? await pathExists(file)\n : false;\n\n const env = fileExists\n ? dotenv(await readFile(file as never, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n", "import type { PluginOptionsResolved } from \"./types\";\n\nexport const typeboxLiteralText = (\n text: string,\n options: Pick<PluginOptionsResolved, \"refineTypeName\">,\n) => {\n return [\n // Escape backticks for safe use in template literals\n [/(?<!\\\\)`/g, \"\\\\`\"],\n // Escape $ for safe use in template literals\n [/(?<!\\\\)\\$\\{/g, \"\\\\${\"],\n /**\n * TypeBox's built-in `Options` type is not configurable.\n * To allow a custom type name, exposing `refineTypeName` option,\n * defaulted to TRefine, then renaming it to `Options`.\n * */\n [new RegExp(`\\\\b${options.refineTypeName}\\\\s*<`, \"g\"), \"Options<\"],\n ].reduce((text, [a, b]) => text.replace(a, b as never), text);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["paths", "writeFile", "basename", "join", "resolve", "styleText", "dirname", "join", "resolve", "styleText", "crc", "glob", "callExpression", "typeNode", "resolve", "crc", "hash", "resolve", "crc", "mkdir", "readFile", "writeFile", "dirname", "join", "crc", "context", "readFile", "crc", "mkdir", "dirname", "writeFile", "join", "crc", "tokens", "e", "glob", "resolve", "join", "crc", "dirname", "styleText", "entry", "validationDefinitions", "id", "routeFiles", "join", "resolve", "styleText", "join", "resolve", "styleText", "resolve", "styleText", "join", "basename", "writeFile", "stopWorker", "readFile", "readFile", "text"]
7
7
  }
@@ -1,4 +1,4 @@
1
- type CreateImport = Record<"coreApi" | "src" | "config" | "api" | "pages" | "fetch" | "lib" | "libApi" | "libEntry", (...a: Array<string>) => string>;
1
+ type CreateImport = Record<"coreApi" | "src" | "config" | "api" | "pages" | "lib" | "libApi" | "libEntry", (...a: Array<string>) => string>;
2
2
  export declare const createTsconfigPaths: (prefix: string) => {
3
3
  [x: string]: string[];
4
4
  };
@@ -6,7 +6,7 @@ export declare const pathResolver: ({ appRoot, sourceFolder, }: {
6
6
  appRoot?: string;
7
7
  sourceFolder: string;
8
8
  }) => {
9
- createPath: Record<"coreApi" | "src" | "config" | "api" | "pages" | "entry" | "fetch" | "lib" | "libApi" | "libEntry" | "libPages", (...a: Array<string>) => string>;
9
+ createPath: Record<"coreApi" | "src" | "config" | "api" | "pages" | "entry" | "lib" | "libApi" | "libEntry" | "libPages", (...a: Array<string>) => string>;
10
10
  createImport: CreateImport;
11
11
  createImportHelper: (k: keyof CreateImport, ...a: Array<string>) => string;
12
12
  };
@@ -1,4 +1,5 @@
1
1
  import handlebars from "handlebars";
2
+ import type { PageRoute } from "./types";
2
3
  export type RenderOptions = {
3
4
  noEscape?: boolean;
4
5
  renderer?: typeof handlebars;
@@ -11,11 +12,8 @@ export type FactoryOptions = RenderOptions & {
11
12
  * - function: custom logic to decide whether to overwrite, based on current file content
12
13
  */
13
14
  overwrite?: boolean | ((fileContent: string) => boolean);
14
- formatters?: Array<Formatter>;
15
15
  };
16
- type Formatter = (content: string, file: string) => string;
17
16
  export declare const render: <Context = object>(template: string, context: Context, options?: RenderOptions) => string;
18
- export declare const renderAsFile: <Context = object>(file: string, template: string, context: Context, options?: Omit<FactoryOptions, "overwrite">) => string;
19
17
  export declare const renderToFile: <Context = object>(file: string, template: string, context: Context, options?: FactoryOptions) => Promise<void>;
20
18
  export declare const renderFactory: (options?: FactoryOptions & {
21
19
  outdir?: string;
@@ -25,4 +23,6 @@ export declare const renderFactory: (options?: FactoryOptions & {
25
23
  render<Context = object>(template: string, context: Context, selfOoptions?: FactoryOptions): string;
26
24
  renderToFile<Context = object>(file: string, template: string, context: Context, selfOoptions?: FactoryOptions): Promise<void>;
27
25
  };
28
- export {};
26
+ export declare const renderHelpers: {
27
+ createParamsLiteral: (params: PageRoute["params"]) => string;
28
+ };
@@ -0,0 +1,47 @@
1
+ import type { PathToken, RouteEntry } from "../types";
2
+ /**
3
+ * Parse a filesystem route path into structured PathToken array.
4
+ *
5
+ * Uses path-to-regexp v8 AST for parsing, with directory-friendly syntax:
6
+ * - [param] => required param - :param
7
+ * - {param} => optional param - {:param}
8
+ * - {...param} => splat - {*param}
9
+ *
10
+ * Direct :param syntax is prohibited outside {} to avoid ambiguity.
11
+ * Inside {} it is treated as path-to-regexp power syntax and used as-is.
12
+ *
13
+ * Examples:
14
+ * Required: [id], [name]
15
+ * Optional: {name}, {format}
16
+ * Splat: {...path}
17
+ * Mixed segments: shop/[id]-{name}
18
+ * Power syntax: {-v:version{-:pre}}, :name{@:version{.:min}}.js
19
+ * */
20
+ export declare const pathTokensFactory: (path: string, { transformStaticValue, }?: {
21
+ transformStaticValue?: (v: string) => string;
22
+ }) => [tokens: Array<PathToken>, pattern: string];
23
+ export declare const normalizeStaticValue: (value: string) => string;
24
+ /**
25
+ * Sort routes so that more specific (static) paths come before dynamic ones.
26
+ *
27
+ * This is important because dynamic segments are more general,
28
+ * and can match values that should be routed to more specific static paths.
29
+ *
30
+ * For example, given:
31
+ * - `/users/account`
32
+ * - `/users/[id]`
33
+ *
34
+ * If `/users/[id]` comes first, visiting `/users/account` would incorrectly match it,
35
+ * treating "account" as an `id`. So static routes must take precedence.
36
+ *
37
+ * Specificity is calculated per segment with fixed weights:
38
+ * - static segment: 4 (most specific, exact match)
39
+ * - mixed segment: 3 (has both static and dynamic parts)
40
+ * - required param: 2 (matches any single segment)
41
+ * - optional param: 1 (may or may not match)
42
+ * - splat param: 0 (matches anything, least specific)
43
+ *
44
+ * Fixed per-segment weights ensure that deeply nested mixed segments
45
+ * never outscore multiple static segments.
46
+ * */
47
+ export declare const sortRoutes: (a: Pick<RouteEntry, "name" | "pathTokens">, b: Pick<RouteEntry, "name" | "pathTokens">) => number;