@kosmojs/dev 0.0.8 → 0.0.10

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 +16 -19
  2. package/pkg/base-plugin/routes.js +391 -196
  3. package/pkg/base-plugin/routes.js.map +4 -4
  4. package/pkg/base-plugin/worker.js +302 -208
  5. package/pkg/base-plugin/worker.js.map +4 -4
  6. package/pkg/cli/cli.js +1 -4
  7. package/pkg/cli/cli.js.map +2 -2
  8. package/pkg/cli/index.js +1 -6
  9. package/pkg/cli/index.js.map +2 -2
  10. package/pkg/cli/templates/@src/api/router.hbs +2 -2
  11. package/pkg/index.js +294 -201
  12. package/pkg/index.js.map +4 -4
  13. package/pkg/src/base-plugin/cache.d.ts +1 -1
  14. package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
  15. package/pkg/src/base-plugin/routes/resolve.d.ts +26 -0
  16. package/pkg/src/base-plugin/routes.d.ts +6 -12
  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/pkg/index.js CHANGED
@@ -88,7 +88,6 @@ var api_handler_default = async (options) => {
88
88
  let devMiddlewareFactory;
89
89
  let teardownHandler;
90
90
  const watcher = async () => {
91
- const outfile = join(outDir, "dev.js");
92
91
  const rebuildPlugin = {
93
92
  name: "rebuild",
94
93
  setup(build) {
@@ -97,7 +96,7 @@ var api_handler_default = async (options) => {
97
96
  await teardownHandler?.(app);
98
97
  }
99
98
  try {
100
- const exports = await import([outfile, Date.now()].join("?"));
99
+ const exports = await import(`${outDir}/app.js?${Date.now()}`);
101
100
  devMiddlewareFactory = exports.devMiddlewareFactory;
102
101
  teardownHandler = exports.teardownHandler;
103
102
  app = await exports.default();
@@ -115,7 +114,7 @@ var api_handler_default = async (options) => {
115
114
  bundle: true,
116
115
  entryPoints: [join(apiDir, "app.ts")],
117
116
  plugins: [rebuildPlugin],
118
- outfile
117
+ outdir: outDir
119
118
  });
120
119
  return {
121
120
  async start() {
@@ -147,6 +146,11 @@ var api_handler_default = async (options) => {
147
146
  };
148
147
 
149
148
  // src/base-plugin/routes.ts
149
+ import {
150
+ defaults as defaults3
151
+ } from "@kosmojs/devlib";
152
+
153
+ // src/base-plugin/routes/resolve.ts
150
154
  import { dirname as dirname2, join as join2, resolve as resolve4 } from "node:path";
151
155
  import crc3 from "crc/crc32";
152
156
  import picomatch from "picomatch";
@@ -428,7 +432,7 @@ var cacheFactory = (route, {
428
432
  const cacheFile = pathResolver({
429
433
  appRoot,
430
434
  sourceFolder
431
- }).resolve("apiLibDir", route.importPath, "cache.json");
435
+ }).resolve("apiLibDir", dirname(route.file), "cache.json");
432
436
  const getCache = async (opt) => {
433
437
  if (await pathExists(cacheFile)) {
434
438
  try {
@@ -509,22 +513,70 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
509
513
  // src/base-plugin/templates/types.hbs
510
514
  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';
511
515
 
512
- // src/base-plugin/routes.ts
513
- var API_INDEX_PATTERN = "index.ts";
514
- var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
516
+ // src/base-plugin/routes/resolve.ts
517
+ var API_INDEX_BASENAME = "index";
518
+ var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
519
+ var API_USE_BASENAME = "use";
520
+ var API_USE_PATTERN = `${API_USE_BASENAME}.ts`;
521
+ var PAGE_INDEX_BASENAME = "index";
522
+ var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
523
+ var PAGE_LAYOUT_BASENAME = "layout";
524
+ var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
515
525
  var ROUTE_FILE_PATTERNS = [
526
+ // match index files in api dir
516
527
  `${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
517
- `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`
528
+ // match use files in api dir
529
+ `${defaults2.apiDir}/**/${API_USE_PATTERN}`,
530
+ // match index files in pages dir
531
+ `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
532
+ // match layout files in pages dir
533
+ `${defaults2.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
518
534
  ];
519
- var resolveRouteFile = (file, { appRoot, sourceFolder }) => {
535
+ var scanRoutes = async ({
536
+ appRoot,
537
+ sourceFolder
538
+ }) => {
539
+ return glob2(ROUTE_FILE_PATTERNS, {
540
+ cwd: resolve4(appRoot, sourceFolder),
541
+ absolute: true,
542
+ onlyFiles: true,
543
+ followSymbolicLinks: false,
544
+ ignore: [
545
+ // ignore top-level matches, routes resides in folders, even index route
546
+ `${defaults2.apiDir}/${API_INDEX_PATTERN}`,
547
+ `${defaults2.apiDir}/${API_USE_PATTERN}`,
548
+ `${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`,
549
+ `${defaults2.pagesDir}/${PAGE_LAYOUT_PATTERN}`
550
+ ]
551
+ });
552
+ };
553
+ var isRouteFile = (file, {
554
+ appRoot,
555
+ sourceFolder
556
+ }) => {
520
557
  const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
521
558
  if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
522
559
  return;
523
560
  }
524
561
  return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
525
562
  };
526
- var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
527
- const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });
563
+ var isApiRoute = (file) => {
564
+ return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
565
+ };
566
+ var isApiUse = (file) => {
567
+ return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);
568
+ };
569
+ var isPageRoute = (file) => {
570
+ return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
571
+ };
572
+ var isPageLayout = (file) => {
573
+ return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
574
+ };
575
+ var createRouteEntry = (_file, {
576
+ appRoot,
577
+ sourceFolder
578
+ }) => {
579
+ const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
528
580
  if (!resolvedPaths) {
529
581
  return;
530
582
  }
@@ -532,22 +584,75 @@ var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
532
584
  const fileFullpath = join2(appRoot, sourceFolder, folder, file);
533
585
  const pathTokens = pathTokensFactory(dirname2(file));
534
586
  const name = pathTokens.map((e) => e.orig).join("/");
535
- const importPath = dirname2(file);
536
- const importName = [
537
- importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
538
- crc3(importPath)
539
- ].join("_");
587
+ const importFile = file;
588
+ const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
540
589
  return {
541
590
  name,
542
591
  folder,
543
592
  file,
544
593
  fileFullpath,
545
594
  pathTokens,
546
- importPath,
595
+ importFile,
547
596
  importName
548
597
  };
549
598
  };
550
- var routes_default = async (pluginOptions) => {
599
+ var pageLayoutResolverFactory = () => {
600
+ return (entry) => {
601
+ const { name } = entry;
602
+ const handler = async () => {
603
+ return {
604
+ kind: "pageLayout",
605
+ entry
606
+ };
607
+ };
608
+ return { name, handler };
609
+ };
610
+ };
611
+ var pageRouteResolverFactory = () => {
612
+ return (entry) => {
613
+ const {
614
+ name,
615
+ folder,
616
+ file,
617
+ fileFullpath,
618
+ pathTokens,
619
+ importFile,
620
+ importName
621
+ } = entry;
622
+ const handler = async () => {
623
+ const entry2 = {
624
+ name,
625
+ pathTokens,
626
+ params: {
627
+ schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
628
+ },
629
+ folder,
630
+ file,
631
+ fileFullpath,
632
+ importFile,
633
+ importName
634
+ };
635
+ return {
636
+ kind: "pageRoute",
637
+ entry: entry2
638
+ };
639
+ };
640
+ return { name, handler };
641
+ };
642
+ };
643
+ var apiUseResolverFactory = () => {
644
+ return (entry) => {
645
+ const { name } = entry;
646
+ const handler = async () => {
647
+ return {
648
+ kind: "apiUse",
649
+ entry
650
+ };
651
+ };
652
+ return { name, handler };
653
+ };
654
+ };
655
+ var apiRouteResolverFactory = (pluginOptions) => {
551
656
  const {
552
657
  appRoot,
553
658
  sourceFolder,
@@ -567,198 +672,186 @@ var routes_default = async (pluginOptions) => {
567
672
  getSourceFile,
568
673
  refreshSourceFile
569
674
  } = typeResolverFactory(pluginOptions);
570
- const resolversFactory = (routeFiles2) => {
571
- const resolvers = /* @__PURE__ */ new Map();
572
- const entries = routeFiles2.flatMap((file) => {
573
- const entry = resolveRouteEntry(file, pluginOptions);
574
- return entry ? [entry] : [];
575
- });
576
- for (const entry of entries.filter((e) => e.folder === defaults2.apiDir)) {
577
- const {
578
- name,
579
- file,
580
- folder,
581
- fileFullpath,
582
- pathTokens,
583
- importPath,
584
- importName
585
- } = entry;
586
- const handler = async (updatedFile) => {
587
- const paramsSchema = pathTokens.flatMap((e) => {
588
- return e.param ? [e.param] : [];
589
- });
590
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
591
- const { getCache, persistCache } = cacheFactory(
592
- { file, fileFullpath, importName, importPath },
675
+ return (entry) => {
676
+ const {
677
+ name,
678
+ file,
679
+ folder,
680
+ fileFullpath,
681
+ pathTokens,
682
+ importFile,
683
+ importName
684
+ } = entry;
685
+ const handler = async (updatedFile) => {
686
+ const paramsSchema = pathTokens.flatMap((e) => {
687
+ return e.param ? [e.param] : [];
688
+ });
689
+ const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
690
+ const { getCache, persistCache } = cacheFactory(
691
+ { file, fileFullpath, importName },
692
+ {
693
+ appRoot,
694
+ sourceFolder,
695
+ extraContext: { resolveTypes }
696
+ }
697
+ );
698
+ let cache = await getCache({ validate: true });
699
+ if (!cache) {
700
+ if (updatedFile === fileFullpath) {
701
+ await refreshSourceFile(fileFullpath);
702
+ }
703
+ const {
704
+ typeDeclarations,
705
+ paramsRefinements,
706
+ methods,
707
+ payloadTypes,
708
+ responseTypes,
709
+ referencedFiles = []
710
+ } = await resolveRouteSignature(
711
+ { importName, fileFullpath, optionalParams },
593
712
  {
594
- appRoot,
595
- sourceFolder,
596
- extraContext: { resolveTypes }
713
+ withReferencedFiles: true,
714
+ sourceFile: getSourceFile(fileFullpath),
715
+ relpathResolver(path) {
716
+ return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
717
+ }
597
718
  }
598
719
  );
599
- let cache = await getCache({ validate: true });
600
- if (!cache) {
601
- if (updatedFile === fileFullpath) {
602
- await refreshSourceFile(fileFullpath);
720
+ const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
721
+ if (text === "number") {
722
+ const param = paramsSchema.at(index);
723
+ return param ? [param.name] : [];
603
724
  }
604
- const {
605
- typeDeclarations,
606
- paramsRefinements,
607
- methods,
608
- payloadTypes,
609
- responseTypes,
610
- referencedFiles = []
611
- } = await resolveRouteSignature(
612
- { importName, fileFullpath, optionalParams },
613
- {
614
- withReferencedFiles: true,
615
- sourceFile: getSourceFile(fileFullpath),
616
- relpathResolver(path) {
617
- return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
618
- }
619
- }
620
- );
621
- const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
622
- if (text === "number") {
623
- const param = paramsSchema.at(index);
624
- return param ? [param.name] : [];
625
- }
626
- return [];
627
- }) : [];
628
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
629
- "apiLibDir",
630
- importPath,
631
- "types.ts"
632
- );
633
- const params = {
634
- id: ["ParamsT", crc3(name)].join(""),
635
- schema: paramsSchema,
636
- resolvedType: void 0
637
- };
638
- const typesFileContent = render(types_default, {
639
- params,
640
- paramsSchema: paramsSchema.map((param, index) => {
641
- return {
642
- ...param,
643
- refinement: paramsRefinements?.at(index)
644
- };
645
- }),
646
- typeDeclarations,
647
- payloadTypes,
648
- responseTypes
649
- });
650
- const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
651
- overrides: [...payloadTypes, ...responseTypes].reduce(
652
- (map, { id, skipValidation }) => {
653
- if (skipValidation) {
654
- map[id] = "never";
655
- }
656
- return map;
657
- },
658
- { [refineTypeName]: refineTypeName }
659
- ),
660
- withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
661
- formatters
662
- }) : void 0;
663
- await renderToFile(
664
- typesFile,
665
- resolvedTypes ? resolved_types_default : typesFileContent,
666
- { resolvedTypes }
667
- );
668
- params.resolvedType = resolvedTypes?.find(
669
- (e) => e.name === params.id
670
- );
671
- cache = await persistCache({
672
- params,
673
- methods,
674
- typeDeclarations,
675
- numericParams,
676
- // text was needed at writing types.ts file, dropping from cache
677
- payloadTypes: payloadTypes.map(({ text, ...rest }) => {
678
- return {
679
- ...rest,
680
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
681
- };
682
- }),
683
- responseTypes: responseTypes.map(({ text, ...rest }) => {
684
- return {
685
- ...rest,
686
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
687
- };
688
- }),
689
- referencedFiles
690
- });
691
- }
692
- const route = {
693
- name,
694
- pathTokens,
695
- params: cache.params,
696
- numericParams: cache.numericParams,
697
- optionalParams,
698
- importName,
699
- importPath,
700
- folder,
701
- file,
702
- fileFullpath,
703
- methods: cache.methods,
704
- typeDeclarations: cache.typeDeclarations,
705
- payloadTypes: cache.payloadTypes,
706
- responseTypes: cache.responseTypes,
707
- referencedFiles: Object.keys(cache.referencedFiles).map(
708
- // expand referenced files path,
709
- // they are stored as relative in cache
710
- (e) => resolve4(appRoot, e)
711
- )
712
- };
713
- return {
714
- kind: "api",
715
- route
725
+ return [];
726
+ }) : [];
727
+ const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
728
+ "apiLibDir",
729
+ dirname2(file),
730
+ "types.ts"
731
+ );
732
+ const params = {
733
+ id: ["ParamsT", crc3(name)].join(""),
734
+ schema: paramsSchema,
735
+ resolvedType: void 0
716
736
  };
717
- };
718
- resolvers.set(fileFullpath, { name, handler });
719
- }
720
- for (const entry of entries.filter((e) => e.folder === defaults2.pagesDir)) {
721
- const {
722
- //
737
+ const typesFileContent = render(types_default, {
738
+ params,
739
+ paramsSchema: paramsSchema.map((param, index) => {
740
+ return {
741
+ ...param,
742
+ refinement: paramsRefinements?.at(index)
743
+ };
744
+ }),
745
+ typeDeclarations,
746
+ payloadTypes,
747
+ responseTypes
748
+ });
749
+ const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
750
+ overrides: [...payloadTypes, ...responseTypes].reduce(
751
+ (map, { id, skipValidation }) => {
752
+ if (skipValidation) {
753
+ map[id] = "never";
754
+ }
755
+ return map;
756
+ },
757
+ { [refineTypeName]: refineTypeName }
758
+ ),
759
+ withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
760
+ formatters
761
+ }) : void 0;
762
+ await renderToFile(
763
+ typesFile,
764
+ resolvedTypes ? resolved_types_default : typesFileContent,
765
+ { resolvedTypes }
766
+ );
767
+ params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
768
+ cache = await persistCache({
769
+ params,
770
+ methods,
771
+ typeDeclarations,
772
+ numericParams,
773
+ // text was needed at writing types.ts file, dropping from cache
774
+ payloadTypes: payloadTypes.map(({ text, ...rest }) => {
775
+ return {
776
+ ...rest,
777
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
778
+ };
779
+ }),
780
+ responseTypes: responseTypes.map(({ text, ...rest }) => {
781
+ return {
782
+ ...rest,
783
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
784
+ };
785
+ }),
786
+ referencedFiles
787
+ });
788
+ }
789
+ const entry2 = {
723
790
  name,
791
+ pathTokens,
792
+ params: cache.params,
793
+ numericParams: cache.numericParams,
794
+ optionalParams,
795
+ importName,
796
+ importFile,
724
797
  folder,
725
798
  file,
726
799
  fileFullpath,
727
- pathTokens,
728
- importPath,
729
- importName
730
- } = entry;
731
- const handler = async () => {
732
- const route = {
733
- name,
734
- pathTokens,
735
- params: {
736
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
737
- },
738
- folder,
739
- file,
740
- fileFullpath,
741
- importPath,
742
- importName
743
- };
744
- return {
745
- kind: "page",
746
- route
747
- };
800
+ methods: cache.methods,
801
+ typeDeclarations: cache.typeDeclarations,
802
+ payloadTypes: cache.payloadTypes,
803
+ responseTypes: cache.responseTypes,
804
+ referencedFiles: Object.keys(cache.referencedFiles).map(
805
+ // expand referenced files path,
806
+ // they are stored as relative in cache
807
+ (e) => resolve4(appRoot, e)
808
+ )
809
+ };
810
+ return {
811
+ kind: "apiRoute",
812
+ entry: entry2
748
813
  };
749
- resolvers.set(fileFullpath, { name, handler });
814
+ };
815
+ return { name, handler };
816
+ };
817
+ };
818
+
819
+ // src/base-plugin/routes/nesting.ts
820
+ import {
821
+ sortRoutes
822
+ } from "@kosmojs/devlib";
823
+
824
+ // src/base-plugin/routes.ts
825
+ var routes_default = async (pluginOptions) => {
826
+ const { appRoot, sourceFolder } = pluginOptions;
827
+ const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
828
+ const apiUseResolver = apiUseResolverFactory(pluginOptions);
829
+ const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
830
+ const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
831
+ const resolversFactory = (routeFiles2) => {
832
+ const resolvers = /* @__PURE__ */ new Map();
833
+ const entries = routeFiles2.flatMap((file) => {
834
+ const entry = createRouteEntry(file, pluginOptions);
835
+ return entry ? [entry] : [];
836
+ });
837
+ for (const entry of entries) {
838
+ if (entry.folder === defaults3.apiDir) {
839
+ if (isApiRoute(entry.file)) {
840
+ resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
841
+ } else if (isApiUse(entry.file)) {
842
+ resolvers.set(entry.fileFullpath, apiUseResolver(entry));
843
+ }
844
+ } else if (entry.folder === defaults3.pagesDir) {
845
+ if (isPageRoute(entry.file)) {
846
+ resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
847
+ } else if (isPageLayout(entry.file)) {
848
+ resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
849
+ }
850
+ }
750
851
  }
751
852
  return resolvers;
752
853
  };
753
- const routeFiles = await glob2(ROUTE_FILE_PATTERNS, {
754
- cwd: resolve4(appRoot, sourceFolder),
755
- absolute: true,
756
- onlyFiles: true,
757
- ignore: [
758
- `${defaults2.apiDir}/${API_INDEX_PATTERN}`,
759
- `${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`
760
- ]
761
- });
854
+ const routeFiles = await scanRoutes({ appRoot, sourceFolder });
762
855
  return {
763
856
  resolvers: resolversFactory(routeFiles),
764
857
  resolversFactory
@@ -934,14 +1027,14 @@ var base_plugin_default = (apiurl, pluginOptions) => {
934
1027
  }
935
1028
  if (store.config.command === "build") {
936
1029
  const { resolvers } = await routes_default(store.resolvedOptions);
937
- const resolvedRoutes = [];
1030
+ const resolvedEntries = [];
938
1031
  {
939
1032
  const spinner = spinnerFactory("Resolving Routes");
940
1033
  for (const { name, handler } of resolvers.values()) {
941
1034
  spinner.append(
942
- `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`
1035
+ `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`
943
1036
  );
944
- resolvedRoutes.push(await handler());
1037
+ resolvedEntries.push(await handler());
945
1038
  }
946
1039
  spinner.succeed();
947
1040
  }
@@ -950,7 +1043,7 @@ var base_plugin_default = (apiurl, pluginOptions) => {
950
1043
  for (const { name, factory } of store.resolvedOptions.generators) {
951
1044
  spinner.append(name);
952
1045
  const { watchHandler } = await factory(store.resolvedOptions);
953
- await watchHandler(resolvedRoutes);
1046
+ await watchHandler(resolvedEntries);
954
1047
  }
955
1048
  spinner.succeed();
956
1049
  }