@kosmojs/dev 0.0.8 → 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 (151) hide show
  1. package/package.json +6 -6
  2. package/pkg/base-plugin/routes.js +359 -196
  3. package/pkg/base-plugin/routes.js.map +4 -4
  4. package/pkg/base-plugin/worker.js +272 -208
  5. package/pkg/base-plugin/worker.js.map +4 -4
  6. package/pkg/index.js +262 -198
  7. package/pkg/index.js.map +4 -4
  8. package/pkg/src/base-plugin/cache.d.ts +1 -1
  9. package/pkg/src/base-plugin/routes/nesting.d.ts +5 -0
  10. package/pkg/src/base-plugin/routes/resolve.d.ts +23 -0
  11. package/pkg/src/base-plugin/routes.d.ts +6 -12
  12. package/pkg/stub-generator/index.js +5 -4
  13. package/pkg/stub-generator/index.js.map +2 -2
  14. package/pkg/test/@fixtures/app/@src/pages/about/careers/[jobId]/index.d.ts +0 -0
  15. package/pkg/test/@fixtures/app/@src/pages/about/careers/layout.d.ts +0 -0
  16. package/pkg/test/@fixtures/app/@src/pages/about/index.d.ts +0 -0
  17. package/pkg/test/@fixtures/app/@src/pages/about/layout.d.ts +0 -0
  18. package/pkg/test/@fixtures/app/@src/pages/about/team/index.d.ts +0 -0
  19. package/pkg/test/@fixtures/app/@src/pages/account/layout.d.ts +0 -0
  20. package/pkg/test/@fixtures/app/@src/pages/account/profile/index.d.ts +0 -0
  21. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/index.d.ts +0 -0
  22. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/[...path]/index.d.ts +0 -0
  23. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/index.d.ts +0 -0
  24. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/[[type]]/layout.d.ts +0 -0
  25. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/index.d.ts +0 -0
  26. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/resources/layout.d.ts +0 -0
  27. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/general/index.d.ts +0 -0
  28. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/index.d.ts +0 -0
  29. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/layout.d.ts +0 -0
  30. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/settings/permissions/index.d.ts +0 -0
  31. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/[userId]/index.d.ts +0 -0
  32. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/index.d.ts +0 -0
  33. package/pkg/test/@fixtures/app/@src/pages/admin/[tenant]/users/layout.d.ts +0 -0
  34. package/pkg/test/@fixtures/app/@src/pages/admin/index.d.ts +0 -0
  35. package/pkg/test/@fixtures/app/@src/pages/admin/layout.d.ts +0 -0
  36. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/[[tag]]/index.d.ts +0 -0
  37. package/pkg/test/@fixtures/app/@src/pages/blog/[[category]]/index.d.ts +0 -0
  38. package/pkg/test/@fixtures/app/@src/pages/blog/index.d.ts +0 -0
  39. package/pkg/test/@fixtures/app/@src/pages/blog/layout.d.ts +0 -0
  40. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/index.d.ts +0 -0
  41. package/pkg/test/@fixtures/app/@src/pages/blog/post/[slug]/layout.d.ts +0 -0
  42. package/pkg/test/@fixtures/app/@src/pages/contact/index.d.ts +0 -0
  43. package/pkg/test/@fixtures/app/@src/pages/contact/layout.d.ts +0 -0
  44. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/layout.d.ts +0 -0
  45. package/pkg/test/@fixtures/app/@src/pages/courses/[courseId]/lessons/[[lessonId]]/assignments/[...assignmentPath]/index.d.ts +0 -0
  46. package/pkg/test/@fixtures/app/@src/pages/dashboard/[view]/index.d.ts +0 -0
  47. package/pkg/test/@fixtures/app/@src/pages/dashboard/analytics/index.d.ts +0 -0
  48. package/pkg/test/@fixtures/app/@src/pages/dashboard/index.d.ts +0 -0
  49. package/pkg/test/@fixtures/app/@src/pages/dashboard/layout.d.ts +0 -0
  50. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/billing/index.d.ts +0 -0
  51. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/index.d.ts +0 -0
  52. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/layout.d.ts +0 -0
  53. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/notifications/index.d.ts +0 -0
  54. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/profile/index.d.ts +0 -0
  55. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/index.d.ts +0 -0
  56. package/pkg/test/@fixtures/app/@src/pages/dashboard/settings/security/layout.d.ts +0 -0
  57. package/pkg/test/@fixtures/app/@src/pages/docs/[...path]/index.d.ts +0 -0
  58. package/pkg/test/@fixtures/app/@src/pages/docs/index.d.ts +0 -0
  59. package/pkg/test/@fixtures/app/@src/pages/docs/layout.d.ts +0 -0
  60. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/index.d.ts +0 -0
  61. package/pkg/test/@fixtures/app/@src/pages/files/[...filePath]/layout.d.ts +0 -0
  62. package/pkg/test/@fixtures/app/@src/pages/legal/layout.d.ts +0 -0
  63. package/pkg/test/@fixtures/app/@src/pages/legal/privacy/index.d.ts +0 -0
  64. package/pkg/test/@fixtures/app/@src/pages/legal/terms/index.d.ts +0 -0
  65. package/pkg/test/@fixtures/app/@src/pages/news/[category]/articles/[...articlePath]/index.d.ts +0 -0
  66. package/pkg/test/@fixtures/app/@src/pages/news/[category]/layout.d.ts +0 -0
  67. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/layout.d.ts +0 -0
  68. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/index.d.ts +0 -0
  69. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/data/[dataView]/layout.d.ts +0 -0
  70. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/[reportType]/layout.d.ts +0 -0
  71. package/pkg/test/@fixtures/app/@src/pages/portal/[clientId]/reports/layout.d.ts +0 -0
  72. package/pkg/test/@fixtures/app/@src/pages/portal/layout.d.ts +0 -0
  73. package/pkg/test/@fixtures/app/@src/pages/products/[id]/index.d.ts +0 -0
  74. package/pkg/test/@fixtures/app/@src/pages/products/index.d.ts +0 -0
  75. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/layout.d.ts +0 -0
  76. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/comments/[...thread]/index.d.ts +0 -0
  77. package/pkg/test/@fixtures/app/@src/pages/profile/[username]/posts/[postId]/layout.d.ts +0 -0
  78. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/[...path]/index.d.ts +0 -0
  79. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/index.d.ts +0 -0
  80. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/files/layout.d.ts +0 -0
  81. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/index.d.ts +0 -0
  82. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/layout.d.ts +0 -0
  83. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/[commentId]/index.d.ts +0 -0
  84. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/index.d.ts +0 -0
  85. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/comments/layout.d.ts +0 -0
  86. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/index.d.ts +0 -0
  87. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/[taskId]/layout.d.ts +0 -0
  88. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/index.d.ts +0 -0
  89. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/tasks/layout.d.ts +0 -0
  90. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/[userId]/index.d.ts +0 -0
  91. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/index.d.ts +0 -0
  92. package/pkg/test/@fixtures/app/@src/pages/projects/[projectId]/team/layout.d.ts +0 -0
  93. package/pkg/test/@fixtures/app/@src/pages/projects/index.d.ts +0 -0
  94. package/pkg/test/@fixtures/app/@src/pages/projects/layout.d.ts +0 -0
  95. package/pkg/test/@fixtures/app/@src/pages/properties/[[city]]/filters/[...filters]/index.d.ts +0 -0
  96. package/pkg/test/@fixtures/app/@src/pages/properties/filters/index.d.ts +0 -0
  97. package/pkg/test/@fixtures/app/@src/pages/properties/layout.d.ts +0 -0
  98. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/[[page]]/index.d.ts +0 -0
  99. package/pkg/test/@fixtures/app/@src/pages/search/[[query]]/layout.d.ts +0 -0
  100. package/pkg/test/@fixtures/app/@src/pages/search/index.d.ts +0 -0
  101. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/index.d.ts +0 -0
  102. package/pkg/test/@fixtures/app/@src/pages/shop/[category]/[productId]/layout.d.ts +0 -0
  103. package/pkg/test/@fixtures/app/@src/pages/shop/cart/index.d.ts +0 -0
  104. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/confirm/index.d.ts +0 -0
  105. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/layout.d.ts +0 -0
  106. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/payment/index.d.ts +0 -0
  107. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/index.d.ts +0 -0
  108. package/pkg/test/@fixtures/app/@src/pages/shop/checkout/shipping/layout.d.ts +0 -0
  109. package/pkg/test/@fixtures/app/@src/pages/shop/index.d.ts +0 -0
  110. package/pkg/test/@fixtures/app/@src/pages/shop/layout.d.ts +0 -0
  111. package/pkg/test/@fixtures/app/@src/pages/shop/orders/[orderId]/index.d.ts +0 -0
  112. package/pkg/test/@fixtures/app/@src/pages/shop/orders/index.d.ts +0 -0
  113. package/pkg/test/@fixtures/app/@src/pages/shop/orders/layout.d.ts +0 -0
  114. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/index.d.ts +0 -0
  115. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/layout.d.ts +0 -0
  116. package/pkg/test/@fixtures/app/@src/pages/shop/product/[id]/reviews/index.d.ts +0 -0
  117. package/pkg/test/@fixtures/app/@src/pages/shop/products/[[category]]/index.d.ts +0 -0
  118. package/pkg/test/@fixtures/app/@src/pages/shop/products/index.d.ts +0 -0
  119. package/pkg/test/@fixtures/app/@src/pages/shop/products/layout.d.ts +0 -0
  120. package/pkg/test/@fixtures/app/@src/pages/signup/index.d.ts +0 -0
  121. package/pkg/test/@fixtures/app/@src/pages/store/[category]/filters/[...filters]/index.d.ts +0 -0
  122. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/[sortBy]/index.d.ts +0 -0
  123. package/pkg/test/@fixtures/app/@src/pages/store/[category]/sort/layout.d.ts +0 -0
  124. package/pkg/test/@fixtures/app/@src/pages/store/layout.d.ts +0 -0
  125. package/pkg/test/@fixtures/app/@src/pages/users/[username]/followers/index.d.ts +0 -0
  126. package/pkg/test/@fixtures/app/@src/pages/users/[username]/following/index.d.ts +0 -0
  127. package/pkg/test/@fixtures/app/@src/pages/users/[username]/index.d.ts +0 -0
  128. package/pkg/test/@fixtures/app/@src/pages/users/[username]/layout.d.ts +0 -0
  129. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/index.d.ts +0 -0
  130. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/[postId]/layout.d.ts +0 -0
  131. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/index.d.ts +0 -0
  132. package/pkg/test/@fixtures/app/@src/pages/users/[username]/posts/layout.d.ts +0 -0
  133. package/pkg/test/@fixtures/app/@src/pages/users/index.d.ts +0 -0
  134. package/pkg/test/@fixtures/app/@src/pages/users/layout.d.ts +0 -0
  135. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/index.d.ts +0 -0
  136. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/[range]/layout.d.ts +0 -0
  137. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/index.d.ts +0 -0
  138. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/analytics/layout.d.ts +0 -0
  139. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/[memberId]/permissions/[...permissionPath]/index.d.ts +0 -0
  140. package/pkg/test/@fixtures/app/@src/pages/workspace/[workspaceId]/team/layout.d.ts +0 -0
  141. package/pkg/test/@fixtures/app/lib/@src/{api}/articles/[...path]/index.ts/types.d.ts +3 -0
  142. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/[[author]]/index.ts/types.d.ts +4 -0
  143. package/pkg/test/@fixtures/app/lib/@src/{api}/books/[category]/index.ts/types.d.ts +3 -0
  144. package/pkg/test/@fixtures/app/lib/@src/{api}/books/index.ts/types.d.ts +1 -0
  145. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/[[id]].json/index.ts/types.d.ts +4 -0
  146. package/pkg/test/@fixtures/app/lib/@src/{api}/files/[[folder]]/index.ts/types.d.ts +3 -0
  147. package/pkg/test/@fixtures/app/lib/@src/{api}/index/index.ts/types.d.ts +1 -0
  148. package/pkg/test/@fixtures/app/lib/@src/{api}/pages/[...path].html/index.ts/types.d.ts +3 -0
  149. package/pkg/test/@fixtures/app/lib/@src/{api}/users/[id].json/index.ts/types.d.ts +3 -0
  150. package/pkg/test/routes/base.d.ts +4 -0
  151. package/pkg/test/routes/nesting.test.d.ts +1 -0
package/pkg/index.js CHANGED
@@ -147,6 +147,11 @@ var api_handler_default = async (options) => {
147
147
  };
148
148
 
149
149
  // src/base-plugin/routes.ts
150
+ import {
151
+ defaults as defaults3
152
+ } from "@kosmojs/devlib";
153
+
154
+ // src/base-plugin/routes/resolve.ts
150
155
  import { dirname as dirname2, join as join2, resolve as resolve4 } from "node:path";
151
156
  import crc3 from "crc/crc32";
152
157
  import picomatch from "picomatch";
@@ -428,7 +433,7 @@ var cacheFactory = (route, {
428
433
  const cacheFile = pathResolver({
429
434
  appRoot,
430
435
  sourceFolder
431
- }).resolve("apiLibDir", route.importPath, "cache.json");
436
+ }).resolve("apiLibDir", dirname(route.file), "cache.json");
432
437
  const getCache = async (opt) => {
433
438
  if (await pathExists(cacheFile)) {
434
439
  try {
@@ -509,22 +514,56 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
509
514
  // src/base-plugin/templates/types.hbs
510
515
  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
516
 
512
- // src/base-plugin/routes.ts
513
- var API_INDEX_PATTERN = "index.ts";
514
- var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
517
+ // src/base-plugin/routes/resolve.ts
518
+ var API_INDEX_BASENAME = "index";
519
+ var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
520
+ var PAGE_INDEX_BASENAME = "index";
521
+ var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
522
+ var PAGE_LAYOUT_BASENAME = "layout";
523
+ var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
515
524
  var ROUTE_FILE_PATTERNS = [
525
+ // match index files in api dir
516
526
  `${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
517
- `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`
527
+ // match index files in pages dir
528
+ `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
529
+ // match layout files in pages dir
530
+ `${defaults2.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
518
531
  ];
519
- var resolveRouteFile = (file, { appRoot, sourceFolder }) => {
532
+ var scanRoutes = async ({
533
+ appRoot,
534
+ sourceFolder
535
+ }) => {
536
+ return glob2(ROUTE_FILE_PATTERNS, {
537
+ cwd: resolve4(appRoot, sourceFolder),
538
+ absolute: true,
539
+ onlyFiles: true,
540
+ followSymbolicLinks: false,
541
+ ignore: [
542
+ // ignore top-level matches, routes resides in folders, even index route
543
+ `${defaults2.apiDir}/${API_INDEX_PATTERN}`,
544
+ `${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`,
545
+ `${defaults2.pagesDir}/${PAGE_LAYOUT_PATTERN}`
546
+ ]
547
+ });
548
+ };
549
+ var isRouteFile = (file, {
550
+ appRoot,
551
+ sourceFolder
552
+ }) => {
520
553
  const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
521
554
  if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
522
555
  return;
523
556
  }
524
557
  return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
525
558
  };
526
- var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
527
- const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });
559
+ var isPageFile = (file) => {
560
+ return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`) ? { kind: "index" } : picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`) ? { kind: "layout" } : void 0;
561
+ };
562
+ var createRouteEntry = (_file, {
563
+ appRoot,
564
+ sourceFolder
565
+ }) => {
566
+ const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
528
567
  if (!resolvedPaths) {
529
568
  return;
530
569
  }
@@ -532,22 +571,63 @@ var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
532
571
  const fileFullpath = join2(appRoot, sourceFolder, folder, file);
533
572
  const pathTokens = pathTokensFactory(dirname2(file));
534
573
  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("_");
574
+ const importFile = file;
575
+ const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
540
576
  return {
541
577
  name,
542
578
  folder,
543
579
  file,
544
580
  fileFullpath,
545
581
  pathTokens,
546
- importPath,
582
+ importFile,
547
583
  importName
548
584
  };
549
585
  };
550
- var routes_default = async (pluginOptions) => {
586
+ var pageLayoutResolverFactory = () => {
587
+ return (entry) => {
588
+ const { name } = entry;
589
+ const handler = async () => {
590
+ return {
591
+ kind: "pageLayout",
592
+ entry
593
+ };
594
+ };
595
+ return { name, handler };
596
+ };
597
+ };
598
+ var pageRouteResolverFactory = () => {
599
+ return (entry) => {
600
+ const {
601
+ name,
602
+ folder,
603
+ file,
604
+ fileFullpath,
605
+ pathTokens,
606
+ importFile,
607
+ importName
608
+ } = entry;
609
+ const handler = async () => {
610
+ const entry2 = {
611
+ name,
612
+ pathTokens,
613
+ params: {
614
+ schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
615
+ },
616
+ folder,
617
+ file,
618
+ fileFullpath,
619
+ importFile,
620
+ importName
621
+ };
622
+ return {
623
+ kind: "pageRoute",
624
+ entry: entry2
625
+ };
626
+ };
627
+ return { name, handler };
628
+ };
629
+ };
630
+ var apiRouteResolverFactory = (pluginOptions) => {
551
631
  const {
552
632
  appRoot,
553
633
  sourceFolder,
@@ -567,198 +647,182 @@ var routes_default = async (pluginOptions) => {
567
647
  getSourceFile,
568
648
  refreshSourceFile
569
649
  } = 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 },
650
+ return (entry) => {
651
+ const {
652
+ name,
653
+ file,
654
+ folder,
655
+ fileFullpath,
656
+ pathTokens,
657
+ importFile,
658
+ importName
659
+ } = entry;
660
+ const handler = async (updatedFile) => {
661
+ const paramsSchema = pathTokens.flatMap((e) => {
662
+ return e.param ? [e.param] : [];
663
+ });
664
+ const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
665
+ const { getCache, persistCache } = cacheFactory(
666
+ { file, fileFullpath, importName },
667
+ {
668
+ appRoot,
669
+ sourceFolder,
670
+ extraContext: { resolveTypes }
671
+ }
672
+ );
673
+ let cache = await getCache({ validate: true });
674
+ if (!cache) {
675
+ if (updatedFile === fileFullpath) {
676
+ await refreshSourceFile(fileFullpath);
677
+ }
678
+ const {
679
+ typeDeclarations,
680
+ paramsRefinements,
681
+ methods,
682
+ payloadTypes,
683
+ responseTypes,
684
+ referencedFiles = []
685
+ } = await resolveRouteSignature(
686
+ { importName, fileFullpath, optionalParams },
593
687
  {
594
- appRoot,
595
- sourceFolder,
596
- extraContext: { resolveTypes }
688
+ withReferencedFiles: true,
689
+ sourceFile: getSourceFile(fileFullpath),
690
+ relpathResolver(path) {
691
+ return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
692
+ }
597
693
  }
598
694
  );
599
- let cache = await getCache({ validate: true });
600
- if (!cache) {
601
- if (updatedFile === fileFullpath) {
602
- await refreshSourceFile(fileFullpath);
695
+ const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
696
+ if (text === "number") {
697
+ const param = paramsSchema.at(index);
698
+ return param ? [param.name] : [];
603
699
  }
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
700
+ return [];
701
+ }) : [];
702
+ const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
703
+ "apiLibDir",
704
+ dirname2(file),
705
+ "types.ts"
706
+ );
707
+ const params = {
708
+ id: ["ParamsT", crc3(name)].join(""),
709
+ schema: paramsSchema,
710
+ resolvedType: void 0
716
711
  };
717
- };
718
- resolvers.set(fileFullpath, { name, handler });
719
- }
720
- for (const entry of entries.filter((e) => e.folder === defaults2.pagesDir)) {
721
- const {
722
- //
712
+ const typesFileContent = render(types_default, {
713
+ params,
714
+ paramsSchema: paramsSchema.map((param, index) => {
715
+ return {
716
+ ...param,
717
+ refinement: paramsRefinements?.at(index)
718
+ };
719
+ }),
720
+ typeDeclarations,
721
+ payloadTypes,
722
+ responseTypes
723
+ });
724
+ const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
725
+ overrides: [...payloadTypes, ...responseTypes].reduce(
726
+ (map, { id, skipValidation }) => {
727
+ if (skipValidation) {
728
+ map[id] = "never";
729
+ }
730
+ return map;
731
+ },
732
+ { [refineTypeName]: refineTypeName }
733
+ ),
734
+ withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
735
+ formatters
736
+ }) : void 0;
737
+ await renderToFile(
738
+ typesFile,
739
+ resolvedTypes ? resolved_types_default : typesFileContent,
740
+ { resolvedTypes }
741
+ );
742
+ params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
743
+ cache = await persistCache({
744
+ params,
745
+ methods,
746
+ typeDeclarations,
747
+ numericParams,
748
+ // text was needed at writing types.ts file, dropping from cache
749
+ payloadTypes: payloadTypes.map(({ text, ...rest }) => {
750
+ return {
751
+ ...rest,
752
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
753
+ };
754
+ }),
755
+ responseTypes: responseTypes.map(({ text, ...rest }) => {
756
+ return {
757
+ ...rest,
758
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
759
+ };
760
+ }),
761
+ referencedFiles
762
+ });
763
+ }
764
+ const entry2 = {
723
765
  name,
766
+ pathTokens,
767
+ params: cache.params,
768
+ numericParams: cache.numericParams,
769
+ optionalParams,
770
+ importName,
771
+ importFile,
724
772
  folder,
725
773
  file,
726
774
  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
- };
775
+ methods: cache.methods,
776
+ typeDeclarations: cache.typeDeclarations,
777
+ payloadTypes: cache.payloadTypes,
778
+ responseTypes: cache.responseTypes,
779
+ referencedFiles: Object.keys(cache.referencedFiles).map(
780
+ // expand referenced files path,
781
+ // they are stored as relative in cache
782
+ (e) => resolve4(appRoot, e)
783
+ )
748
784
  };
749
- resolvers.set(fileFullpath, { name, handler });
785
+ return {
786
+ kind: "apiRoute",
787
+ entry: entry2
788
+ };
789
+ };
790
+ return { name, handler };
791
+ };
792
+ };
793
+
794
+ // src/base-plugin/routes/nesting.ts
795
+ import {
796
+ sortRoutes
797
+ } from "@kosmojs/devlib";
798
+
799
+ // src/base-plugin/routes.ts
800
+ var routes_default = async (pluginOptions) => {
801
+ const { appRoot, sourceFolder } = pluginOptions;
802
+ const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
803
+ const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
804
+ const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
805
+ const resolversFactory = (routeFiles2) => {
806
+ const resolvers = /* @__PURE__ */ new Map();
807
+ const entries = routeFiles2.flatMap((file) => {
808
+ const entry = createRouteEntry(file, pluginOptions);
809
+ return entry ? [entry] : [];
810
+ });
811
+ for (const entry of entries) {
812
+ if (entry.folder === defaults3.apiDir) {
813
+ resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
814
+ } else if (entry.folder === defaults3.pagesDir) {
815
+ const pageFile = isPageFile(entry.file);
816
+ if (pageFile?.kind === "index") {
817
+ resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
818
+ } else if (pageFile?.kind === "layout") {
819
+ resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
820
+ }
821
+ }
750
822
  }
751
823
  return resolvers;
752
824
  };
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
- });
825
+ const routeFiles = await scanRoutes({ appRoot, sourceFolder });
762
826
  return {
763
827
  resolvers: resolversFactory(routeFiles),
764
828
  resolversFactory
@@ -934,14 +998,14 @@ var base_plugin_default = (apiurl, pluginOptions) => {
934
998
  }
935
999
  if (store.config.command === "build") {
936
1000
  const { resolvers } = await routes_default(store.resolvedOptions);
937
- const resolvedRoutes = [];
1001
+ const resolvedEntries = [];
938
1002
  {
939
1003
  const spinner = spinnerFactory("Resolving Routes");
940
1004
  for (const { name, handler } of resolvers.values()) {
941
1005
  spinner.append(
942
- `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`
1006
+ `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`
943
1007
  );
944
- resolvedRoutes.push(await handler());
1008
+ resolvedEntries.push(await handler());
945
1009
  }
946
1010
  spinner.succeed();
947
1011
  }
@@ -950,7 +1014,7 @@ var base_plugin_default = (apiurl, pluginOptions) => {
950
1014
  for (const { name, factory } of store.resolvedOptions.generators) {
951
1015
  spinner.append(name);
952
1016
  const { watchHandler } = await factory(store.resolvedOptions);
953
- await watchHandler(resolvedRoutes);
1017
+ await watchHandler(resolvedEntries);
954
1018
  }
955
1019
  spinner.succeed();
956
1020
  }