@kosmojs/dev 0.0.7 → 0.0.9

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 (156) hide show
  1. package/package.json +7 -6
  2. package/pkg/base-plugin/routes.js +384 -216
  3. package/pkg/base-plugin/routes.js.map +4 -4
  4. package/pkg/base-plugin/worker.js +297 -235
  5. package/pkg/base-plugin/worker.js.map +4 -4
  6. package/pkg/cli/cli.js +4 -8
  7. package/pkg/cli/cli.js.map +2 -2
  8. package/pkg/cli/index.js +4 -8
  9. package/pkg/cli/index.js.map +2 -2
  10. package/pkg/index.js +286 -219
  11. package/pkg/index.js.map +4 -4
  12. package/pkg/src/base-plugin/cache.d.ts +1 -1
  13. package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
  14. package/pkg/src/base-plugin/routes/resolve.d.ts +23 -0
  15. package/pkg/src/base-plugin/routes.d.ts +6 -10
  16. package/pkg/src/index.d.ts +1 -1
  17. package/pkg/stub-generator/index.js +5 -4
  18. package/pkg/stub-generator/index.js.map +2 -2
  19. package/pkg/test/@fixtures/app/@src/pages/about/careers/[jobId]/index.d.ts +0 -0
  20. package/pkg/test/@fixtures/app/@src/pages/about/careers/layout.d.ts +0 -0
  21. package/pkg/test/@fixtures/app/@src/pages/about/index.d.ts +0 -0
  22. package/pkg/test/@fixtures/app/@src/pages/about/layout.d.ts +0 -0
  23. package/pkg/test/@fixtures/app/@src/pages/about/team/index.d.ts +0 -0
  24. package/pkg/test/@fixtures/app/@src/pages/account/layout.d.ts +0 -0
  25. package/pkg/test/@fixtures/app/@src/pages/account/profile/index.d.ts +0 -0
  26. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/index.d.ts +0 -0
  27. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  28. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  29. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  30. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/index.d.ts +0 -0
  31. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  32. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  33. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/index.d.ts +0 -0
  34. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  35. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  36. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  37. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/index.d.ts +0 -0
  38. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/layout.d.ts +0 -0
  39. package/pkg/test/@fixtures/app/@src/pages/admin/index.d.ts +0 -0
  40. package/pkg/test/@fixtures/app/@src/pages/admin/layout.d.ts +0 -0
  41. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  42. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/index.d.ts +0 -0
  43. package/pkg/test/@fixtures/app/@src/pages/blog/index.d.ts +0 -0
  44. package/pkg/test/@fixtures/app/@src/pages/blog/layout.d.ts +0 -0
  45. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/index.d.ts +0 -0
  46. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/layout.d.ts +0 -0
  47. package/pkg/test/@fixtures/app/@src/pages/contact/index.d.ts +0 -0
  48. package/pkg/test/@fixtures/app/@src/pages/contact/layout.d.ts +0 -0
  49. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/layout.d.ts +0 -0
  50. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  51. package/pkg/test/@fixtures/app/@src/pages/dashboard/[view]/index.d.ts +0 -0
  52. package/pkg/test/@fixtures/app/@src/pages/dashboard/analytics/index.d.ts +0 -0
  53. package/pkg/test/@fixtures/app/@src/pages/dashboard/index.d.ts +0 -0
  54. package/pkg/test/@fixtures/app/@src/pages/dashboard/layout.d.ts +0 -0
  55. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/billing/index.d.ts +0 -0
  56. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/index.d.ts +0 -0
  57. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/layout.d.ts +0 -0
  58. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/notifications/index.d.ts +0 -0
  59. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/profile/index.d.ts +0 -0
  60. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/index.d.ts +0 -0
  61. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/layout.d.ts +0 -0
  62. package/pkg/test/@fixtures/app/@src/pages/docs/[...path]/index.d.ts +0 -0
  63. package/pkg/test/@fixtures/app/@src/pages/docs/index.d.ts +0 -0
  64. package/pkg/test/@fixtures/app/@src/pages/docs/layout.d.ts +0 -0
  65. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/index.d.ts +0 -0
  66. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/layout.d.ts +0 -0
  67. package/pkg/test/@fixtures/app/@src/pages/legal/layout.d.ts +0 -0
  68. package/pkg/test/@fixtures/app/@src/pages/legal/privacy/index.d.ts +0 -0
  69. package/pkg/test/@fixtures/app/@src/pages/legal/terms/index.d.ts +0 -0
  70. package/pkg/test/@fixtures/app/@src/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  71. package/pkg/test/@fixtures/app/@src/pages/news/[category]/layout.d.ts +0 -0
  72. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/layout.d.ts +0 -0
  73. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  74. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  75. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  76. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  77. package/pkg/test/@fixtures/app/@src/pages/portal/layout.d.ts +0 -0
  78. package/pkg/test/@fixtures/app/@src/pages/products/[id]/index.d.ts +0 -0
  79. package/pkg/test/@fixtures/app/@src/pages/products/index.d.ts +0 -0
  80. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/layout.d.ts +0 -0
  81. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  82. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  83. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  84. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/index.d.ts +0 -0
  85. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/layout.d.ts +0 -0
  86. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/index.d.ts +0 -0
  87. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/layout.d.ts +0 -0
  88. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  89. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  90. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  91. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  92. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  93. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  94. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  95. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  96. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/index.d.ts +0 -0
  97. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/layout.d.ts +0 -0
  98. package/pkg/test/@fixtures/app/@src/pages/projects/index.d.ts +0 -0
  99. package/pkg/test/@fixtures/app/@src/pages/projects/layout.d.ts +0 -0
  100. package/pkg/test/@fixtures/app/@src/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  101. package/pkg/test/@fixtures/app/@src/pages/properties/filters/index.d.ts +0 -0
  102. package/pkg/test/@fixtures/app/@src/pages/properties/layout.d.ts +0 -0
  103. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  104. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/layout.d.ts +0 -0
  105. package/pkg/test/@fixtures/app/@src/pages/search/index.d.ts +0 -0
  106. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/index.d.ts +0 -0
  107. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  108. package/pkg/test/@fixtures/app/@src/pages/shop/cart/index.d.ts +0 -0
  109. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/confirm/index.d.ts +0 -0
  110. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/layout.d.ts +0 -0
  111. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/payment/index.d.ts +0 -0
  112. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/index.d.ts +0 -0
  113. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/layout.d.ts +0 -0
  114. package/pkg/test/@fixtures/app/@src/pages/shop/index.d.ts +0 -0
  115. package/pkg/test/@fixtures/app/@src/pages/shop/layout.d.ts +0 -0
  116. package/pkg/test/@fixtures/app/@src/pages/shop/orders/[orderId]/index.d.ts +0 -0
  117. package/pkg/test/@fixtures/app/@src/pages/shop/orders/index.d.ts +0 -0
  118. package/pkg/test/@fixtures/app/@src/pages/shop/orders/layout.d.ts +0 -0
  119. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/index.d.ts +0 -0
  120. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/layout.d.ts +0 -0
  121. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  122. package/pkg/test/@fixtures/app/@src/pages/shop/products/[[category]]/index.d.ts +0 -0
  123. package/pkg/test/@fixtures/app/@src/pages/shop/products/index.d.ts +0 -0
  124. package/pkg/test/@fixtures/app/@src/pages/shop/products/layout.d.ts +0 -0
  125. package/pkg/test/@fixtures/app/@src/pages/signup/index.d.ts +0 -0
  126. package/pkg/test/@fixtures/app/@src/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  127. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  128. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/layout.d.ts +0 -0
  129. package/pkg/test/@fixtures/app/@src/pages/store/layout.d.ts +0 -0
  130. package/pkg/test/@fixtures/app/@src/pages/users/[username]/followers/index.d.ts +0 -0
  131. package/pkg/test/@fixtures/app/@src/pages/users/[username]/following/index.d.ts +0 -0
  132. package/pkg/test/@fixtures/app/@src/pages/users/[username]/index.d.ts +0 -0
  133. package/pkg/test/@fixtures/app/@src/pages/users/[username]/layout.d.ts +0 -0
  134. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  135. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  136. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/index.d.ts +0 -0
  137. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/layout.d.ts +0 -0
  138. package/pkg/test/@fixtures/app/@src/pages/users/index.d.ts +0 -0
  139. package/pkg/test/@fixtures/app/@src/pages/users/layout.d.ts +0 -0
  140. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  141. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  142. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  143. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  144. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  145. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  146. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +3 -0
  147. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +4 -0
  148. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +3 -0
  149. package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +1 -0
  150. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +4 -0
  151. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +3 -0
  152. package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +1 -0
  153. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +3 -0
  154. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +3 -0
  155. package/pkg/test/routes/base.d.ts +4 -0
  156. package/pkg/test/routes/nesting.test.d.ts +1 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@kosmojs/dev",
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "cacheVersion": "001",
6
6
  "author": "Slee Woo",
7
7
  "license": "MIT",
@@ -46,10 +46,10 @@
46
46
  "tinyglobby": "^0.2.15",
47
47
  "ts-morph": "^27.0.2",
48
48
  "typescript": "^5.9.3",
49
- "@kosmojs/api": "^0.0.7",
50
- "@kosmojs/api-generator": "^0.0.7",
51
- "@kosmojs/devlib": "^0.0.7",
52
- "@kosmojs/fetch-generator": "^0.0.7"
49
+ "@kosmojs/api": "^0.0.9",
50
+ "@kosmojs/api-generator": "^0.0.9",
51
+ "@kosmojs/devlib": "^0.0.9",
52
+ "@kosmojs/fetch-generator": "^0.0.9"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@solidjs/router": "^0.15.4",
@@ -63,6 +63,7 @@
63
63
  "@types/react-dom": "^19.2.3",
64
64
  "@vitejs/plugin-react": "^5.1.1",
65
65
  "@vitejs/plugin-vue": "^6.0.1",
66
+ "path-to-regexp": "^8.3.0",
66
67
  "qs": "^6.14.0",
67
68
  "react": "^19.2.0",
68
69
  "react-dom": "^19.2.0",
@@ -73,7 +74,7 @@
73
74
  "vite-plugin-solid": "^2.11.10",
74
75
  "vue": "^3.5.24",
75
76
  "vue-router": "^4.6.3",
76
- "@kosmojs/config": "^0.0.7"
77
+ "@kosmojs/config": "^0.0.9"
77
78
  },
78
79
  "scripts": {
79
80
  "build": "esbuilder src/index.ts src/base-plugin/routes.ts src/base-plugin/worker.ts src/stub-generator/index.ts src/cli/cli.ts src/cli/index.ts",
@@ -1,4 +1,9 @@
1
1
  // src/base-plugin/routes.ts
2
+ import {
3
+ defaults as defaults2
4
+ } from "@kosmojs/devlib";
5
+
6
+ // src/base-plugin/routes/resolve.ts
2
7
  import { dirname as dirname2, join, resolve as resolve3 } from "node:path";
3
8
  import crc3 from "crc/crc32";
4
9
  import picomatch from "picomatch";
@@ -280,7 +285,7 @@ var cacheFactory = (route, {
280
285
  const cacheFile = pathResolver({
281
286
  appRoot,
282
287
  sourceFolder
283
- }).resolve("apiLibDir", route.importPath, "cache.json");
288
+ }).resolve("apiLibDir", dirname(route.file), "cache.json");
284
289
  const getCache = async (opt) => {
285
290
  if (await pathExists(cacheFile)) {
286
291
  try {
@@ -361,8 +366,123 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
361
366
  // src/base-plugin/templates/types.hbs
362
367
  var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
363
368
 
364
- // src/base-plugin/routes.ts
365
- var routes_default = async (pluginOptions) => {
369
+ // src/base-plugin/routes/resolve.ts
370
+ var API_INDEX_BASENAME = "index";
371
+ var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
372
+ var PAGE_INDEX_BASENAME = "index";
373
+ var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
374
+ var PAGE_LAYOUT_BASENAME = "layout";
375
+ var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
376
+ var ROUTE_FILE_PATTERNS = [
377
+ // match index files in api dir
378
+ `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
379
+ // match index files in pages dir
380
+ `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
381
+ // match layout files in pages dir
382
+ `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
383
+ ];
384
+ var scanRoutes = async ({
385
+ appRoot,
386
+ sourceFolder
387
+ }) => {
388
+ return glob(ROUTE_FILE_PATTERNS, {
389
+ cwd: resolve3(appRoot, sourceFolder),
390
+ absolute: true,
391
+ onlyFiles: true,
392
+ followSymbolicLinks: false,
393
+ ignore: [
394
+ // ignore top-level matches, routes resides in folders, even index route
395
+ `${defaults.apiDir}/${API_INDEX_PATTERN}`,
396
+ `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
397
+ `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
398
+ ]
399
+ });
400
+ };
401
+ var isRouteFile = (file, {
402
+ appRoot,
403
+ sourceFolder
404
+ }) => {
405
+ const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/`, "").split("/");
406
+ if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
407
+ return;
408
+ }
409
+ return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
410
+ };
411
+ var isPageFile = (file) => {
412
+ return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`) ? { kind: "index" } : picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`) ? { kind: "layout" } : void 0;
413
+ };
414
+ var isIndexFile = (file) => {
415
+ return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`) || picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
416
+ };
417
+ var createRouteEntry = (_file, {
418
+ appRoot,
419
+ sourceFolder
420
+ }) => {
421
+ const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
422
+ if (!resolvedPaths) {
423
+ return;
424
+ }
425
+ const [folder, file] = resolvedPaths;
426
+ const fileFullpath = join(appRoot, sourceFolder, folder, file);
427
+ const pathTokens = pathTokensFactory(dirname2(file));
428
+ const name = pathTokens.map((e) => e.orig).join("/");
429
+ const importFile = file;
430
+ const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
431
+ return {
432
+ name,
433
+ folder,
434
+ file,
435
+ fileFullpath,
436
+ pathTokens,
437
+ importFile,
438
+ importName
439
+ };
440
+ };
441
+ var pageLayoutResolverFactory = () => {
442
+ return (entry) => {
443
+ const { name } = entry;
444
+ const handler = async () => {
445
+ return {
446
+ kind: "pageLayout",
447
+ entry
448
+ };
449
+ };
450
+ return { name, handler };
451
+ };
452
+ };
453
+ var pageRouteResolverFactory = () => {
454
+ return (entry) => {
455
+ const {
456
+ name,
457
+ folder,
458
+ file,
459
+ fileFullpath,
460
+ pathTokens,
461
+ importFile,
462
+ importName
463
+ } = entry;
464
+ const handler = async () => {
465
+ const entry2 = {
466
+ name,
467
+ pathTokens,
468
+ params: {
469
+ schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
470
+ },
471
+ folder,
472
+ file,
473
+ fileFullpath,
474
+ importFile,
475
+ importName
476
+ };
477
+ return {
478
+ kind: "pageRoute",
479
+ entry: entry2
480
+ };
481
+ };
482
+ return { name, handler };
483
+ };
484
+ };
485
+ var apiRouteResolverFactory = (pluginOptions) => {
366
486
  const {
367
487
  appRoot,
368
488
  sourceFolder,
@@ -382,238 +502,286 @@ var routes_default = async (pluginOptions) => {
382
502
  getSourceFile,
383
503
  refreshSourceFile
384
504
  } = typeResolverFactory(pluginOptions);
385
- const routeFilePatterns = [
386
- `${defaults.apiDir}/**/index.ts`,
387
- `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`
388
- ];
389
- const resolveRouteFile = (file) => {
390
- const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/`, "").split("/");
391
- if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
392
- return;
393
- }
394
- return picomatch.isMatch(join(folder, ...rest), routeFilePatterns) ? [folder, rest.join("/")] : void 0;
395
- };
396
- const resolversFactory = (routeFiles2) => {
397
- const resolvers = /* @__PURE__ */ new Map();
398
- const entries = routeFiles2.flatMap((_file) => {
399
- const resolvedPaths = resolveRouteFile(_file);
400
- if (!resolvedPaths) {
401
- return [];
402
- }
403
- const [folder, file] = resolvedPaths;
404
- const fileFullpath = join(appRoot, sourceFolder, folder, file);
405
- const pathTokens = pathTokensFactory(dirname2(file));
406
- const name = pathTokens.map((e) => e.orig).join("/");
407
- const importPath = dirname2(file);
408
- const importName = [
409
- importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
410
- crc3(importPath)
411
- ].join("_");
412
- return [
505
+ return (entry) => {
506
+ const {
507
+ name,
508
+ file,
509
+ folder,
510
+ fileFullpath,
511
+ pathTokens,
512
+ importFile,
513
+ importName
514
+ } = entry;
515
+ const handler = async (updatedFile) => {
516
+ const paramsSchema = pathTokens.flatMap((e) => {
517
+ return e.param ? [e.param] : [];
518
+ });
519
+ const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
520
+ const { getCache, persistCache } = cacheFactory(
521
+ { file, fileFullpath, importName },
413
522
  {
414
- name,
415
- folder,
416
- file,
417
- fileFullpath,
418
- pathTokens,
419
- importPath,
420
- importName
523
+ appRoot,
524
+ sourceFolder,
525
+ extraContext: { resolveTypes }
421
526
  }
422
- ];
423
- });
424
- for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {
425
- const {
426
- name,
427
- file,
428
- folder,
429
- fileFullpath,
430
- pathTokens,
431
- importPath,
432
- importName
433
- } = entry;
434
- const handler = async (updatedFile) => {
435
- const paramsSchema = pathTokens.flatMap((e) => {
436
- return e.param ? [e.param] : [];
437
- });
438
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
439
- const { getCache, persistCache } = cacheFactory(
440
- { file, fileFullpath, importName, importPath },
527
+ );
528
+ let cache = await getCache({ validate: true });
529
+ if (!cache) {
530
+ if (updatedFile === fileFullpath) {
531
+ await refreshSourceFile(fileFullpath);
532
+ }
533
+ const {
534
+ typeDeclarations,
535
+ paramsRefinements,
536
+ methods,
537
+ payloadTypes,
538
+ responseTypes,
539
+ referencedFiles = []
540
+ } = await resolveRouteSignature(
541
+ { importName, fileFullpath, optionalParams },
441
542
  {
442
- appRoot,
443
- sourceFolder,
444
- extraContext: { resolveTypes }
543
+ withReferencedFiles: true,
544
+ sourceFile: getSourceFile(fileFullpath),
545
+ relpathResolver(path) {
546
+ return join(sourceFolder, defaults.apiDir, dirname2(file), path);
547
+ }
445
548
  }
446
549
  );
447
- let cache = await getCache({ validate: true });
448
- if (!cache) {
449
- if (updatedFile === fileFullpath) {
450
- await refreshSourceFile(fileFullpath);
550
+ const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
551
+ if (text === "number") {
552
+ const param = paramsSchema.at(index);
553
+ return param ? [param.name] : [];
451
554
  }
452
- const {
453
- typeDeclarations,
454
- paramsRefinements,
455
- methods,
456
- payloadTypes,
457
- responseTypes,
458
- referencedFiles = []
459
- } = await resolveRouteSignature(
460
- { importName, fileFullpath, optionalParams },
461
- {
462
- withReferencedFiles: true,
463
- sourceFile: getSourceFile(fileFullpath),
464
- relpathResolver(path) {
465
- return join(sourceFolder, defaults.apiDir, dirname2(file), path);
466
- }
467
- }
468
- );
469
- const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
470
- if (text === "number") {
471
- const param = paramsSchema.at(index);
472
- return param ? [param.name] : [];
473
- }
474
- return [];
475
- }) : [];
476
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
477
- "apiLibDir",
478
- importPath,
479
- "types.ts"
480
- );
481
- const params = {
482
- id: ["ParamsT", crc3(name)].join(""),
483
- schema: paramsSchema,
484
- resolvedType: void 0
485
- };
486
- const typesFileContent = render(types_default, {
487
- params,
488
- paramsSchema: paramsSchema.map((param, index) => {
489
- return {
490
- ...param,
491
- refinement: paramsRefinements?.at(index)
492
- };
493
- }),
494
- typeDeclarations,
495
- payloadTypes,
496
- responseTypes
497
- });
498
- const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
499
- overrides: [...payloadTypes, ...responseTypes].reduce(
500
- (map, { id, skipValidation }) => {
501
- if (skipValidation) {
502
- map[id] = "never";
503
- }
504
- return map;
505
- },
506
- { [refineTypeName]: refineTypeName }
507
- ),
508
- withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
509
- formatters
510
- }) : void 0;
511
- await renderToFile(
512
- typesFile,
513
- resolvedTypes ? resolved_types_default : typesFileContent,
514
- { resolvedTypes }
515
- );
516
- params.resolvedType = resolvedTypes?.find(
517
- (e) => e.name === params.id
518
- );
519
- cache = await persistCache({
520
- params,
521
- methods,
522
- typeDeclarations,
523
- numericParams,
524
- // text was needed at writing types.ts file, dropping from cache
525
- payloadTypes: payloadTypes.map(({ text, ...rest }) => {
526
- return {
527
- ...rest,
528
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
529
- };
530
- }),
531
- responseTypes: responseTypes.map(({ text, ...rest }) => {
532
- return {
533
- ...rest,
534
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
535
- };
536
- }),
537
- referencedFiles
538
- });
539
- }
540
- const route = {
541
- name,
542
- pathTokens,
543
- params: cache.params,
544
- numericParams: cache.numericParams,
545
- optionalParams,
546
- importName,
547
- importPath,
548
- folder,
549
- file,
550
- fileFullpath,
551
- methods: cache.methods,
552
- typeDeclarations: cache.typeDeclarations,
553
- payloadTypes: cache.payloadTypes,
554
- responseTypes: cache.responseTypes,
555
- referencedFiles: Object.keys(cache.referencedFiles).map(
556
- // expand referenced files path,
557
- // they are stored as relative in cache
558
- (e) => resolve3(appRoot, e)
559
- )
560
- };
561
- return {
562
- kind: "api",
563
- route
555
+ return [];
556
+ }) : [];
557
+ const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
558
+ "apiLibDir",
559
+ dirname2(file),
560
+ "types.ts"
561
+ );
562
+ const params = {
563
+ id: ["ParamsT", crc3(name)].join(""),
564
+ schema: paramsSchema,
565
+ resolvedType: void 0
564
566
  };
565
- };
566
- resolvers.set(fileFullpath, { name, handler });
567
- }
568
- for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {
569
- const {
570
- //
567
+ const typesFileContent = render(types_default, {
568
+ params,
569
+ paramsSchema: paramsSchema.map((param, index) => {
570
+ return {
571
+ ...param,
572
+ refinement: paramsRefinements?.at(index)
573
+ };
574
+ }),
575
+ typeDeclarations,
576
+ payloadTypes,
577
+ responseTypes
578
+ });
579
+ const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
580
+ overrides: [...payloadTypes, ...responseTypes].reduce(
581
+ (map, { id, skipValidation }) => {
582
+ if (skipValidation) {
583
+ map[id] = "never";
584
+ }
585
+ return map;
586
+ },
587
+ { [refineTypeName]: refineTypeName }
588
+ ),
589
+ withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
590
+ formatters
591
+ }) : void 0;
592
+ await renderToFile(
593
+ typesFile,
594
+ resolvedTypes ? resolved_types_default : typesFileContent,
595
+ { resolvedTypes }
596
+ );
597
+ params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
598
+ cache = await persistCache({
599
+ params,
600
+ methods,
601
+ typeDeclarations,
602
+ numericParams,
603
+ // text was needed at writing types.ts file, dropping from cache
604
+ payloadTypes: payloadTypes.map(({ text, ...rest }) => {
605
+ return {
606
+ ...rest,
607
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
608
+ };
609
+ }),
610
+ responseTypes: responseTypes.map(({ text, ...rest }) => {
611
+ return {
612
+ ...rest,
613
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
614
+ };
615
+ }),
616
+ referencedFiles
617
+ });
618
+ }
619
+ const entry2 = {
571
620
  name,
621
+ pathTokens,
622
+ params: cache.params,
623
+ numericParams: cache.numericParams,
624
+ optionalParams,
625
+ importName,
626
+ importFile,
572
627
  folder,
573
628
  file,
574
629
  fileFullpath,
575
- pathTokens,
576
- importPath,
577
- importName
578
- } = entry;
579
- const handler = async () => {
580
- const route = {
581
- name,
582
- pathTokens,
583
- params: {
584
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
585
- },
586
- folder,
587
- file,
588
- fileFullpath,
589
- importPath,
590
- importName
591
- };
592
- return {
593
- kind: "page",
594
- route
595
- };
630
+ methods: cache.methods,
631
+ typeDeclarations: cache.typeDeclarations,
632
+ payloadTypes: cache.payloadTypes,
633
+ responseTypes: cache.responseTypes,
634
+ referencedFiles: Object.keys(cache.referencedFiles).map(
635
+ // expand referenced files path,
636
+ // they are stored as relative in cache
637
+ (e) => resolve3(appRoot, e)
638
+ )
596
639
  };
597
- resolvers.set(fileFullpath, { name, handler });
640
+ return {
641
+ kind: "apiRoute",
642
+ entry: entry2
643
+ };
644
+ };
645
+ return { name, handler };
646
+ };
647
+ };
648
+
649
+ // src/base-plugin/routes/nesting.ts
650
+ import { basename } from "node:path";
651
+ import {
652
+ sortRoutes
653
+ } from "@kosmojs/devlib";
654
+ var nestedRoutesFactory = (routeEntries) => {
655
+ const entryStack = structuredClone(routeEntries).sort(sortRoutes);
656
+ const transformEntries = (entries, parent) => {
657
+ return [...new Set(entries.map((e) => e.name))].flatMap((name) => {
658
+ const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {
659
+ return entry.name === name ? [entry] : [];
660
+ });
661
+ const index = nameEntries.find(
662
+ (e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME)
663
+ );
664
+ const layout = nameEntries.find(
665
+ (e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME)
666
+ );
667
+ if (index || layout) {
668
+ return [
669
+ {
670
+ index: index ? {
671
+ ...index,
672
+ pathTokens: index.pathTokens.slice(
673
+ parent?.pathTokens.length || 0
674
+ )
675
+ } : void 0,
676
+ layout: layout ? {
677
+ ...layout,
678
+ pathTokens: layout.pathTokens.slice(
679
+ parent?.pathTokens.length || 0
680
+ )
681
+ } : void 0,
682
+ parent: parent?.name,
683
+ children: transformEntries(
684
+ findDescendantEntries(index || layout),
685
+ index || layout
686
+ )
687
+ }
688
+ ];
689
+ }
690
+ return [];
691
+ });
692
+ };
693
+ const findDescendantEntries = ({
694
+ name,
695
+ pathTokens
696
+ }) => {
697
+ const potentialChildren = entryStack.filter((entry) => {
698
+ if (entry.pathTokens.length <= pathTokens.length) {
699
+ return false;
700
+ }
701
+ if (!entry.name.startsWith(`${name}/`)) {
702
+ return false;
703
+ }
704
+ return true;
705
+ });
706
+ return potentialChildren.filter((child) => {
707
+ const hasIntermediateRoute = potentialChildren.some((intermediate) => {
708
+ if (intermediate === child) {
709
+ return false;
710
+ }
711
+ if (intermediate.pathTokens.length <= pathTokens.length) {
712
+ return false;
713
+ }
714
+ if (intermediate.pathTokens.length >= child.pathTokens.length) {
715
+ return false;
716
+ }
717
+ return child.name.startsWith(`${intermediate.name}/`);
718
+ });
719
+ return !hasIntermediateRoute;
720
+ });
721
+ };
722
+ const rootEntries = entryStack.filter((entry) => {
723
+ const hasParent = entryStack.some((potential) => {
724
+ if (potential === entry) {
725
+ return false;
726
+ }
727
+ if (potential.pathTokens.length >= entry.pathTokens.length) {
728
+ return false;
729
+ }
730
+ return entry.name.startsWith(`${potential.name}/`);
731
+ });
732
+ return !hasParent;
733
+ });
734
+ return transformEntries(rootEntries);
735
+ };
736
+
737
+ // src/base-plugin/routes.ts
738
+ var routes_default = async (pluginOptions) => {
739
+ const { appRoot, sourceFolder } = pluginOptions;
740
+ const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
741
+ const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
742
+ const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
743
+ const resolversFactory = (routeFiles2) => {
744
+ const resolvers = /* @__PURE__ */ new Map();
745
+ const entries = routeFiles2.flatMap((file) => {
746
+ const entry = createRouteEntry(file, pluginOptions);
747
+ return entry ? [entry] : [];
748
+ });
749
+ for (const entry of entries) {
750
+ if (entry.folder === defaults2.apiDir) {
751
+ resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
752
+ } else if (entry.folder === defaults2.pagesDir) {
753
+ const pageFile = isPageFile(entry.file);
754
+ if (pageFile?.kind === "index") {
755
+ resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
756
+ } else if (pageFile?.kind === "layout") {
757
+ resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
758
+ }
759
+ }
598
760
  }
599
761
  return resolvers;
600
762
  };
601
- const routeFiles = await glob(routeFilePatterns, {
602
- cwd: resolve3(appRoot, sourceFolder),
603
- absolute: true,
604
- onlyFiles: true,
605
- ignore: [
606
- `${defaults.apiDir}/index.ts`,
607
- `${defaults.pagesDir}/index.ts{x,}`
608
- ]
609
- });
763
+ const routeFiles = await scanRoutes({ appRoot, sourceFolder });
610
764
  return {
611
765
  resolvers: resolversFactory(routeFiles),
612
- resolversFactory,
613
- resolveRouteFile
766
+ resolversFactory
614
767
  };
615
768
  };
616
769
  export {
617
- routes_default as default
770
+ API_INDEX_BASENAME,
771
+ API_INDEX_PATTERN,
772
+ PAGE_INDEX_BASENAME,
773
+ PAGE_INDEX_PATTERN,
774
+ PAGE_LAYOUT_BASENAME,
775
+ PAGE_LAYOUT_PATTERN,
776
+ apiRouteResolverFactory,
777
+ createRouteEntry,
778
+ routes_default as default,
779
+ isIndexFile,
780
+ isPageFile,
781
+ isRouteFile,
782
+ nestedRoutesFactory,
783
+ pageLayoutResolverFactory,
784
+ pageRouteResolverFactory,
785
+ scanRoutes
618
786
  };
619
787
  //# sourceMappingURL=routes.js.map