@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/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,8 +514,120 @@ 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 routes_default = async (pluginOptions) => {
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}`;
524
+ var ROUTE_FILE_PATTERNS = [
525
+ // match index files in api dir
526
+ `${defaults2.apiDir}/**/${API_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}`
531
+ ];
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
+ }) => {
553
+ const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
554
+ if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
555
+ return;
556
+ }
557
+ return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
558
+ };
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 });
567
+ if (!resolvedPaths) {
568
+ return;
569
+ }
570
+ const [folder, file] = resolvedPaths;
571
+ const fileFullpath = join2(appRoot, sourceFolder, folder, file);
572
+ const pathTokens = pathTokensFactory(dirname2(file));
573
+ const name = pathTokens.map((e) => e.orig).join("/");
574
+ const importFile = file;
575
+ const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
576
+ return {
577
+ name,
578
+ folder,
579
+ file,
580
+ fileFullpath,
581
+ pathTokens,
582
+ importFile,
583
+ importName
584
+ };
585
+ };
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) => {
514
631
  const {
515
632
  appRoot,
516
633
  sourceFolder,
@@ -530,235 +647,185 @@ var routes_default = async (pluginOptions) => {
530
647
  getSourceFile,
531
648
  refreshSourceFile
532
649
  } = typeResolverFactory(pluginOptions);
533
- const routeFilePatterns = [
534
- `${defaults2.apiDir}/**/index.ts`,
535
- `${defaults2.pagesDir}/**/index.{ts,tsx,vue,svelte}`
536
- ];
537
- const resolveRouteFile = (file) => {
538
- const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
539
- if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
540
- return;
541
- }
542
- return picomatch.isMatch(join2(folder, ...rest), routeFilePatterns) ? [folder, rest.join("/")] : void 0;
543
- };
544
- const resolversFactory = (routeFiles2) => {
545
- const resolvers = /* @__PURE__ */ new Map();
546
- const entries = routeFiles2.flatMap((_file) => {
547
- const resolvedPaths = resolveRouteFile(_file);
548
- if (!resolvedPaths) {
549
- return [];
550
- }
551
- const [folder, file] = resolvedPaths;
552
- const fileFullpath = join2(appRoot, sourceFolder, folder, file);
553
- const pathTokens = pathTokensFactory(dirname2(file));
554
- const name = pathTokens.map((e) => e.orig).join("/");
555
- const importPath = dirname2(file);
556
- const importName = [
557
- importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
558
- crc3(importPath)
559
- ].join("_");
560
- return [
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 },
561
667
  {
562
- name,
563
- folder,
564
- file,
565
- fileFullpath,
566
- pathTokens,
567
- importPath,
568
- importName
668
+ appRoot,
669
+ sourceFolder,
670
+ extraContext: { resolveTypes }
569
671
  }
570
- ];
571
- });
572
- for (const entry of entries.filter((e) => e.folder === defaults2.apiDir)) {
573
- const {
574
- name,
575
- file,
576
- folder,
577
- fileFullpath,
578
- pathTokens,
579
- importPath,
580
- importName
581
- } = entry;
582
- const handler = async (updatedFile) => {
583
- const paramsSchema = pathTokens.flatMap((e) => {
584
- return e.param ? [e.param] : [];
585
- });
586
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
587
- const { getCache, persistCache } = cacheFactory(
588
- { file, fileFullpath, importName, importPath },
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 },
589
687
  {
590
- appRoot,
591
- sourceFolder,
592
- extraContext: { resolveTypes }
688
+ withReferencedFiles: true,
689
+ sourceFile: getSourceFile(fileFullpath),
690
+ relpathResolver(path) {
691
+ return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
692
+ }
593
693
  }
594
694
  );
595
- let cache = await getCache({ validate: true });
596
- if (!cache) {
597
- if (updatedFile === fileFullpath) {
598
- 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] : [];
599
699
  }
600
- const {
601
- typeDeclarations,
602
- paramsRefinements,
603
- methods,
604
- payloadTypes,
605
- responseTypes,
606
- referencedFiles = []
607
- } = await resolveRouteSignature(
608
- { importName, fileFullpath, optionalParams },
609
- {
610
- withReferencedFiles: true,
611
- sourceFile: getSourceFile(fileFullpath),
612
- relpathResolver(path) {
613
- return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
614
- }
615
- }
616
- );
617
- const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
618
- if (text === "number") {
619
- const param = paramsSchema.at(index);
620
- return param ? [param.name] : [];
621
- }
622
- return [];
623
- }) : [];
624
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
625
- "apiLibDir",
626
- importPath,
627
- "types.ts"
628
- );
629
- const params = {
630
- id: ["ParamsT", crc3(name)].join(""),
631
- schema: paramsSchema,
632
- resolvedType: void 0
633
- };
634
- const typesFileContent = render(types_default, {
635
- params,
636
- paramsSchema: paramsSchema.map((param, index) => {
637
- return {
638
- ...param,
639
- refinement: paramsRefinements?.at(index)
640
- };
641
- }),
642
- typeDeclarations,
643
- payloadTypes,
644
- responseTypes
645
- });
646
- const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
647
- overrides: [...payloadTypes, ...responseTypes].reduce(
648
- (map, { id, skipValidation }) => {
649
- if (skipValidation) {
650
- map[id] = "never";
651
- }
652
- return map;
653
- },
654
- { [refineTypeName]: refineTypeName }
655
- ),
656
- withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
657
- formatters
658
- }) : void 0;
659
- await renderToFile(
660
- typesFile,
661
- resolvedTypes ? resolved_types_default : typesFileContent,
662
- { resolvedTypes }
663
- );
664
- params.resolvedType = resolvedTypes?.find(
665
- (e) => e.name === params.id
666
- );
667
- cache = await persistCache({
668
- params,
669
- methods,
670
- typeDeclarations,
671
- numericParams,
672
- // text was needed at writing types.ts file, dropping from cache
673
- payloadTypes: payloadTypes.map(({ text, ...rest }) => {
674
- return {
675
- ...rest,
676
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
677
- };
678
- }),
679
- responseTypes: responseTypes.map(({ text, ...rest }) => {
680
- return {
681
- ...rest,
682
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
683
- };
684
- }),
685
- referencedFiles
686
- });
687
- }
688
- const route = {
689
- name,
690
- pathTokens,
691
- params: cache.params,
692
- numericParams: cache.numericParams,
693
- optionalParams,
694
- importName,
695
- importPath,
696
- folder,
697
- file,
698
- fileFullpath,
699
- methods: cache.methods,
700
- typeDeclarations: cache.typeDeclarations,
701
- payloadTypes: cache.payloadTypes,
702
- responseTypes: cache.responseTypes,
703
- referencedFiles: Object.keys(cache.referencedFiles).map(
704
- // expand referenced files path,
705
- // they are stored as relative in cache
706
- (e) => resolve4(appRoot, e)
707
- )
708
- };
709
- return {
710
- kind: "api",
711
- 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
712
711
  };
713
- };
714
- resolvers.set(fileFullpath, { name, handler });
715
- }
716
- for (const entry of entries.filter((e) => e.folder === defaults2.pagesDir)) {
717
- const {
718
- //
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 = {
719
765
  name,
766
+ pathTokens,
767
+ params: cache.params,
768
+ numericParams: cache.numericParams,
769
+ optionalParams,
770
+ importName,
771
+ importFile,
720
772
  folder,
721
773
  file,
722
774
  fileFullpath,
723
- pathTokens,
724
- importPath,
725
- importName
726
- } = entry;
727
- const handler = async () => {
728
- const route = {
729
- name,
730
- pathTokens,
731
- params: {
732
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
733
- },
734
- folder,
735
- file,
736
- fileFullpath,
737
- importPath,
738
- importName
739
- };
740
- return {
741
- kind: "page",
742
- route
743
- };
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
+ )
744
784
  };
745
- 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
+ }
746
822
  }
747
823
  return resolvers;
748
824
  };
749
- const routeFiles = await glob2(routeFilePatterns, {
750
- cwd: resolve4(appRoot, sourceFolder),
751
- absolute: true,
752
- onlyFiles: true,
753
- ignore: [
754
- `${defaults2.apiDir}/index.ts`,
755
- `${defaults2.pagesDir}/index.ts{x,}`
756
- ]
757
- });
825
+ const routeFiles = await scanRoutes({ appRoot, sourceFolder });
758
826
  return {
759
827
  resolvers: resolversFactory(routeFiles),
760
- resolversFactory,
761
- resolveRouteFile
828
+ resolversFactory
762
829
  };
763
830
  };
764
831
 
@@ -931,14 +998,14 @@ var base_plugin_default = (apiurl, pluginOptions) => {
931
998
  }
932
999
  if (store.config.command === "build") {
933
1000
  const { resolvers } = await routes_default(store.resolvedOptions);
934
- const resolvedRoutes = [];
1001
+ const resolvedEntries = [];
935
1002
  {
936
1003
  const spinner = spinnerFactory("Resolving Routes");
937
1004
  for (const { name, handler } of resolvers.values()) {
938
1005
  spinner.append(
939
- `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`
1006
+ `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`
940
1007
  );
941
- resolvedRoutes.push(await handler());
1008
+ resolvedEntries.push(await handler());
942
1009
  }
943
1010
  spinner.succeed();
944
1011
  }
@@ -947,7 +1014,7 @@ var base_plugin_default = (apiurl, pluginOptions) => {
947
1014
  for (const { name, factory } of store.resolvedOptions.generators) {
948
1015
  spinner.append(name);
949
1016
  const { watchHandler } = await factory(store.resolvedOptions);
950
- await watchHandler(resolvedRoutes);
1017
+ await watchHandler(resolvedEntries);
951
1018
  }
952
1019
  spinner.succeed();
953
1020
  }