@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
@@ -1,4 +1,9 @@
1
1
  // src/base-plugin/routes.ts
2
+ import {
3
+ defaults as defaults2
4
+ } from "@kosmojs/devlib";
5
+
6
+ // src/base-plugin/routes/resolve.ts
2
7
  import { dirname as dirname2, join, resolve as resolve3 } from "node:path";
3
8
  import crc3 from "crc/crc32";
4
9
  import picomatch from "picomatch";
@@ -280,7 +285,7 @@ var cacheFactory = (route, {
280
285
  const cacheFile = pathResolver({
281
286
  appRoot,
282
287
  sourceFolder
283
- }).resolve("apiLibDir", route.importPath, "cache.json");
288
+ }).resolve("apiLibDir", dirname(route.file), "cache.json");
284
289
  const getCache = async (opt) => {
285
290
  if (await pathExists(cacheFile)) {
286
291
  try {
@@ -361,22 +366,70 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
361
366
  // src/base-plugin/templates/types.hbs
362
367
  var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
363
368
 
364
- // src/base-plugin/routes.ts
365
- var API_INDEX_PATTERN = "index.ts";
366
- var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
369
+ // src/base-plugin/routes/resolve.ts
370
+ var API_INDEX_BASENAME = "index";
371
+ var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
372
+ var API_USE_BASENAME = "use";
373
+ var API_USE_PATTERN = `${API_USE_BASENAME}.ts`;
374
+ var PAGE_INDEX_BASENAME = "index";
375
+ var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
376
+ var PAGE_LAYOUT_BASENAME = "layout";
377
+ var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
367
378
  var ROUTE_FILE_PATTERNS = [
379
+ // match index files in api dir
368
380
  `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,
369
- `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`
381
+ // match use files in api dir
382
+ `${defaults.apiDir}/**/${API_USE_PATTERN}`,
383
+ // match index files in pages dir
384
+ `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
385
+ // match layout files in pages dir
386
+ `${defaults.pagesDir}/**/${PAGE_LAYOUT_PATTERN}`
370
387
  ];
371
- var resolveRouteFile = (file, { appRoot, sourceFolder }) => {
388
+ var scanRoutes = async ({
389
+ appRoot,
390
+ sourceFolder
391
+ }) => {
392
+ return glob(ROUTE_FILE_PATTERNS, {
393
+ cwd: resolve3(appRoot, sourceFolder),
394
+ absolute: true,
395
+ onlyFiles: true,
396
+ followSymbolicLinks: false,
397
+ ignore: [
398
+ // ignore top-level matches, routes resides in folders, even index route
399
+ `${defaults.apiDir}/${API_INDEX_PATTERN}`,
400
+ `${defaults.apiDir}/${API_USE_PATTERN}`,
401
+ `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,
402
+ `${defaults.pagesDir}/${PAGE_LAYOUT_PATTERN}`
403
+ ]
404
+ });
405
+ };
406
+ var isRouteFile = (file, {
407
+ appRoot,
408
+ sourceFolder
409
+ }) => {
372
410
  const [_sourceFolder, folder, ...rest] = resolve3(appRoot, file).replace(`${appRoot}/`, "").split("/");
373
411
  if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
374
412
  return;
375
413
  }
376
414
  return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
377
415
  };
378
- var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
379
- const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });
416
+ var isApiRoute = (file) => {
417
+ return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
418
+ };
419
+ var isApiUse = (file) => {
420
+ return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);
421
+ };
422
+ var isPageRoute = (file) => {
423
+ return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
424
+ };
425
+ var isPageLayout = (file) => {
426
+ return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
427
+ };
428
+ var createRouteEntry = (_file, {
429
+ appRoot,
430
+ sourceFolder
431
+ }) => {
432
+ const resolvedPaths = isRouteFile(_file, { appRoot, sourceFolder });
380
433
  if (!resolvedPaths) {
381
434
  return;
382
435
  }
@@ -384,22 +437,75 @@ var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
384
437
  const fileFullpath = join(appRoot, sourceFolder, folder, file);
385
438
  const pathTokens = pathTokensFactory(dirname2(file));
386
439
  const name = pathTokens.map((e) => e.orig).join("/");
387
- const importPath = dirname2(file);
388
- const importName = [
389
- importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
390
- crc3(importPath)
391
- ].join("_");
440
+ const importFile = file;
441
+ const importName = `${importFile.replace(/\W+/g, "_")}_${crc3(importFile)}`;
392
442
  return {
393
443
  name,
394
444
  folder,
395
445
  file,
396
446
  fileFullpath,
397
447
  pathTokens,
398
- importPath,
448
+ importFile,
399
449
  importName
400
450
  };
401
451
  };
402
- var routes_default = async (pluginOptions) => {
452
+ var pageLayoutResolverFactory = () => {
453
+ return (entry) => {
454
+ const { name } = entry;
455
+ const handler = async () => {
456
+ return {
457
+ kind: "pageLayout",
458
+ entry
459
+ };
460
+ };
461
+ return { name, handler };
462
+ };
463
+ };
464
+ var pageRouteResolverFactory = () => {
465
+ return (entry) => {
466
+ const {
467
+ name,
468
+ folder,
469
+ file,
470
+ fileFullpath,
471
+ pathTokens,
472
+ importFile,
473
+ importName
474
+ } = entry;
475
+ const handler = async () => {
476
+ const entry2 = {
477
+ name,
478
+ pathTokens,
479
+ params: {
480
+ schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
481
+ },
482
+ folder,
483
+ file,
484
+ fileFullpath,
485
+ importFile,
486
+ importName
487
+ };
488
+ return {
489
+ kind: "pageRoute",
490
+ entry: entry2
491
+ };
492
+ };
493
+ return { name, handler };
494
+ };
495
+ };
496
+ var apiUseResolverFactory = () => {
497
+ return (entry) => {
498
+ const { name } = entry;
499
+ const handler = async () => {
500
+ return {
501
+ kind: "apiUse",
502
+ entry
503
+ };
504
+ };
505
+ return { name, handler };
506
+ };
507
+ };
508
+ var apiRouteResolverFactory = (pluginOptions) => {
403
509
  const {
404
510
  appRoot,
405
511
  sourceFolder,
@@ -419,206 +525,295 @@ var routes_default = async (pluginOptions) => {
419
525
  getSourceFile,
420
526
  refreshSourceFile
421
527
  } = typeResolverFactory(pluginOptions);
422
- const resolversFactory = (routeFiles2) => {
423
- const resolvers = /* @__PURE__ */ new Map();
424
- const entries = routeFiles2.flatMap((file) => {
425
- const entry = resolveRouteEntry(file, pluginOptions);
426
- return entry ? [entry] : [];
427
- });
428
- for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {
429
- const {
430
- name,
431
- file,
432
- folder,
433
- fileFullpath,
434
- pathTokens,
435
- importPath,
436
- importName
437
- } = entry;
438
- const handler = async (updatedFile) => {
439
- const paramsSchema = pathTokens.flatMap((e) => {
440
- return e.param ? [e.param] : [];
441
- });
442
- const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
443
- const { getCache, persistCache } = cacheFactory(
444
- { file, fileFullpath, importName, importPath },
528
+ return (entry) => {
529
+ const {
530
+ name,
531
+ file,
532
+ folder,
533
+ fileFullpath,
534
+ pathTokens,
535
+ importFile,
536
+ importName
537
+ } = entry;
538
+ const handler = async (updatedFile) => {
539
+ const paramsSchema = pathTokens.flatMap((e) => {
540
+ return e.param ? [e.param] : [];
541
+ });
542
+ const optionalParams = paramsSchema.length ? !paramsSchema.some((e) => e.isRequired) : true;
543
+ const { getCache, persistCache } = cacheFactory(
544
+ { file, fileFullpath, importName },
545
+ {
546
+ appRoot,
547
+ sourceFolder,
548
+ extraContext: { resolveTypes }
549
+ }
550
+ );
551
+ let cache = await getCache({ validate: true });
552
+ if (!cache) {
553
+ if (updatedFile === fileFullpath) {
554
+ await refreshSourceFile(fileFullpath);
555
+ }
556
+ const {
557
+ typeDeclarations,
558
+ paramsRefinements,
559
+ methods,
560
+ payloadTypes,
561
+ responseTypes,
562
+ referencedFiles = []
563
+ } = await resolveRouteSignature(
564
+ { importName, fileFullpath, optionalParams },
445
565
  {
446
- appRoot,
447
- sourceFolder,
448
- extraContext: { resolveTypes }
566
+ withReferencedFiles: true,
567
+ sourceFile: getSourceFile(fileFullpath),
568
+ relpathResolver(path) {
569
+ return join(sourceFolder, defaults.apiDir, dirname2(file), path);
570
+ }
449
571
  }
450
572
  );
451
- let cache = await getCache({ validate: true });
452
- if (!cache) {
453
- if (updatedFile === fileFullpath) {
454
- await refreshSourceFile(fileFullpath);
573
+ const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
574
+ if (text === "number") {
575
+ const param = paramsSchema.at(index);
576
+ return param ? [param.name] : [];
455
577
  }
456
- const {
457
- typeDeclarations,
458
- paramsRefinements,
459
- methods,
460
- payloadTypes,
461
- responseTypes,
462
- referencedFiles = []
463
- } = await resolveRouteSignature(
464
- { importName, fileFullpath, optionalParams },
465
- {
466
- withReferencedFiles: true,
467
- sourceFile: getSourceFile(fileFullpath),
468
- relpathResolver(path) {
469
- return join(sourceFolder, defaults.apiDir, dirname2(file), path);
470
- }
471
- }
472
- );
473
- const numericParams = paramsRefinements ? paramsRefinements.flatMap(({ text, index }) => {
474
- if (text === "number") {
475
- const param = paramsSchema.at(index);
476
- return param ? [param.name] : [];
477
- }
478
- return [];
479
- }) : [];
480
- const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
481
- "apiLibDir",
482
- importPath,
483
- "types.ts"
484
- );
485
- const params = {
486
- id: ["ParamsT", crc3(name)].join(""),
487
- schema: paramsSchema,
488
- resolvedType: void 0
489
- };
490
- const typesFileContent = render(types_default, {
491
- params,
492
- paramsSchema: paramsSchema.map((param, index) => {
493
- return {
494
- ...param,
495
- refinement: paramsRefinements?.at(index)
496
- };
497
- }),
498
- typeDeclarations,
499
- payloadTypes,
500
- responseTypes
501
- });
502
- const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
503
- overrides: [...payloadTypes, ...responseTypes].reduce(
504
- (map, { id, skipValidation }) => {
505
- if (skipValidation) {
506
- map[id] = "never";
507
- }
508
- return map;
509
- },
510
- { [refineTypeName]: refineTypeName }
511
- ),
512
- withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
513
- formatters
514
- }) : void 0;
515
- await renderToFile(
516
- typesFile,
517
- resolvedTypes ? resolved_types_default : typesFileContent,
518
- { resolvedTypes }
519
- );
520
- params.resolvedType = resolvedTypes?.find(
521
- (e) => e.name === params.id
522
- );
523
- cache = await persistCache({
524
- params,
525
- methods,
526
- typeDeclarations,
527
- numericParams,
528
- // text was needed at writing types.ts file, dropping from cache
529
- payloadTypes: payloadTypes.map(({ text, ...rest }) => {
530
- return {
531
- ...rest,
532
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
533
- };
534
- }),
535
- responseTypes: responseTypes.map(({ text, ...rest }) => {
536
- return {
537
- ...rest,
538
- resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
539
- };
540
- }),
541
- referencedFiles
542
- });
543
- }
544
- const route = {
545
- name,
546
- pathTokens,
547
- params: cache.params,
548
- numericParams: cache.numericParams,
549
- optionalParams,
550
- importName,
551
- importPath,
552
- folder,
553
- file,
554
- fileFullpath,
555
- methods: cache.methods,
556
- typeDeclarations: cache.typeDeclarations,
557
- payloadTypes: cache.payloadTypes,
558
- responseTypes: cache.responseTypes,
559
- referencedFiles: Object.keys(cache.referencedFiles).map(
560
- // expand referenced files path,
561
- // they are stored as relative in cache
562
- (e) => resolve3(appRoot, e)
563
- )
564
- };
565
- return {
566
- kind: "api",
567
- route
578
+ return [];
579
+ }) : [];
580
+ const typesFile = pathResolver2({ appRoot, sourceFolder }).resolve(
581
+ "apiLibDir",
582
+ dirname2(file),
583
+ "types.ts"
584
+ );
585
+ const params = {
586
+ id: ["ParamsT", crc3(name)].join(""),
587
+ schema: paramsSchema,
588
+ resolvedType: void 0
568
589
  };
569
- };
570
- resolvers.set(fileFullpath, { name, handler });
571
- }
572
- for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {
573
- const {
574
- //
590
+ const typesFileContent = render(types_default, {
591
+ params,
592
+ paramsSchema: paramsSchema.map((param, index) => {
593
+ return {
594
+ ...param,
595
+ refinement: paramsRefinements?.at(index)
596
+ };
597
+ }),
598
+ typeDeclarations,
599
+ payloadTypes,
600
+ responseTypes
601
+ });
602
+ const resolvedTypes = resolveTypes ? literalTypesResolver(typesFileContent, {
603
+ overrides: [...payloadTypes, ...responseTypes].reduce(
604
+ (map, { id, skipValidation }) => {
605
+ if (skipValidation) {
606
+ map[id] = "never";
607
+ }
608
+ return map;
609
+ },
610
+ { [refineTypeName]: refineTypeName }
611
+ ),
612
+ withProperties: [params.id, ...payloadTypes.map((e) => e.id)],
613
+ formatters
614
+ }) : void 0;
615
+ await renderToFile(
616
+ typesFile,
617
+ resolvedTypes ? resolved_types_default : typesFileContent,
618
+ { resolvedTypes }
619
+ );
620
+ params.resolvedType = resolvedTypes?.find((e) => e.name === params.id);
621
+ cache = await persistCache({
622
+ params,
623
+ methods,
624
+ typeDeclarations,
625
+ numericParams,
626
+ // text was needed at writing types.ts file, dropping from cache
627
+ payloadTypes: payloadTypes.map(({ text, ...rest }) => {
628
+ return {
629
+ ...rest,
630
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
631
+ };
632
+ }),
633
+ responseTypes: responseTypes.map(({ text, ...rest }) => {
634
+ return {
635
+ ...rest,
636
+ resolvedType: resolvedTypes?.find((e) => e.name === rest.id)
637
+ };
638
+ }),
639
+ referencedFiles
640
+ });
641
+ }
642
+ const entry2 = {
575
643
  name,
644
+ pathTokens,
645
+ params: cache.params,
646
+ numericParams: cache.numericParams,
647
+ optionalParams,
648
+ importName,
649
+ importFile,
576
650
  folder,
577
651
  file,
578
652
  fileFullpath,
579
- pathTokens,
580
- importPath,
581
- importName
582
- } = entry;
583
- const handler = async () => {
584
- const route = {
585
- name,
586
- pathTokens,
587
- params: {
588
- schema: pathTokens.flatMap((e) => e.param ? [e.param] : [])
589
- },
590
- folder,
591
- file,
592
- fileFullpath,
593
- importPath,
594
- importName
595
- };
596
- return {
597
- kind: "page",
598
- route
599
- };
653
+ methods: cache.methods,
654
+ typeDeclarations: cache.typeDeclarations,
655
+ payloadTypes: cache.payloadTypes,
656
+ responseTypes: cache.responseTypes,
657
+ referencedFiles: Object.keys(cache.referencedFiles).map(
658
+ // expand referenced files path,
659
+ // they are stored as relative in cache
660
+ (e) => resolve3(appRoot, e)
661
+ )
600
662
  };
601
- resolvers.set(fileFullpath, { name, handler });
663
+ return {
664
+ kind: "apiRoute",
665
+ entry: entry2
666
+ };
667
+ };
668
+ return { name, handler };
669
+ };
670
+ };
671
+
672
+ // src/base-plugin/routes/nesting.ts
673
+ import { basename } from "node:path";
674
+ import {
675
+ sortRoutes
676
+ } from "@kosmojs/devlib";
677
+ var nestedRoutesFactory = (routeEntries) => {
678
+ const entryStack = structuredClone(routeEntries).sort(sortRoutes);
679
+ const transformEntries = (entries, parent) => {
680
+ return [...new Set(entries.map((e) => e.name))].flatMap((name) => {
681
+ const nameEntries = entryStack.flatMap(({ fileFullpath, ...entry }) => {
682
+ return entry.name === name ? [entry] : [];
683
+ });
684
+ const index = nameEntries.find(
685
+ (e) => basename(e.file).startsWith(PAGE_INDEX_BASENAME)
686
+ );
687
+ const layout = nameEntries.find(
688
+ (e) => basename(e.file).startsWith(PAGE_LAYOUT_BASENAME)
689
+ );
690
+ if (index || layout) {
691
+ return [
692
+ {
693
+ index: index ? {
694
+ ...index,
695
+ pathTokens: index.pathTokens.slice(
696
+ parent?.pathTokens.length || 0
697
+ )
698
+ } : void 0,
699
+ layout: layout ? {
700
+ ...layout,
701
+ pathTokens: layout.pathTokens.slice(
702
+ parent?.pathTokens.length || 0
703
+ )
704
+ } : void 0,
705
+ parent: parent?.name,
706
+ children: transformEntries(
707
+ findDescendantEntries(index || layout),
708
+ index || layout
709
+ )
710
+ }
711
+ ];
712
+ }
713
+ return [];
714
+ });
715
+ };
716
+ const findDescendantEntries = ({
717
+ name,
718
+ pathTokens
719
+ }) => {
720
+ const potentialChildren = entryStack.filter((entry) => {
721
+ if (entry.pathTokens.length <= pathTokens.length) {
722
+ return false;
723
+ }
724
+ if (!entry.name.startsWith(`${name}/`)) {
725
+ return false;
726
+ }
727
+ return true;
728
+ });
729
+ return potentialChildren.filter((child) => {
730
+ const hasIntermediateRoute = potentialChildren.some((intermediate) => {
731
+ if (intermediate === child) {
732
+ return false;
733
+ }
734
+ if (intermediate.pathTokens.length <= pathTokens.length) {
735
+ return false;
736
+ }
737
+ if (intermediate.pathTokens.length >= child.pathTokens.length) {
738
+ return false;
739
+ }
740
+ return child.name.startsWith(`${intermediate.name}/`);
741
+ });
742
+ return !hasIntermediateRoute;
743
+ });
744
+ };
745
+ const rootEntries = entryStack.filter((entry) => {
746
+ const hasParent = entryStack.some((potential) => {
747
+ if (potential === entry) {
748
+ return false;
749
+ }
750
+ if (potential.pathTokens.length >= entry.pathTokens.length) {
751
+ return false;
752
+ }
753
+ return entry.name.startsWith(`${potential.name}/`);
754
+ });
755
+ return !hasParent;
756
+ });
757
+ return transformEntries(rootEntries);
758
+ };
759
+
760
+ // src/base-plugin/routes.ts
761
+ var routes_default = async (pluginOptions) => {
762
+ const { appRoot, sourceFolder } = pluginOptions;
763
+ const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
764
+ const apiUseResolver = apiUseResolverFactory(pluginOptions);
765
+ const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
766
+ const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
767
+ const resolversFactory = (routeFiles2) => {
768
+ const resolvers = /* @__PURE__ */ new Map();
769
+ const entries = routeFiles2.flatMap((file) => {
770
+ const entry = createRouteEntry(file, pluginOptions);
771
+ return entry ? [entry] : [];
772
+ });
773
+ for (const entry of entries) {
774
+ if (entry.folder === defaults2.apiDir) {
775
+ if (isApiRoute(entry.file)) {
776
+ resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
777
+ } else if (isApiUse(entry.file)) {
778
+ resolvers.set(entry.fileFullpath, apiUseResolver(entry));
779
+ }
780
+ } else if (entry.folder === defaults2.pagesDir) {
781
+ if (isPageRoute(entry.file)) {
782
+ resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
783
+ } else if (isPageLayout(entry.file)) {
784
+ resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
785
+ }
786
+ }
602
787
  }
603
788
  return resolvers;
604
789
  };
605
- const routeFiles = await glob(ROUTE_FILE_PATTERNS, {
606
- cwd: resolve3(appRoot, sourceFolder),
607
- absolute: true,
608
- onlyFiles: true,
609
- ignore: [
610
- `${defaults.apiDir}/${API_INDEX_PATTERN}`,
611
- `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`
612
- ]
613
- });
790
+ const routeFiles = await scanRoutes({ appRoot, sourceFolder });
614
791
  return {
615
792
  resolvers: resolversFactory(routeFiles),
616
793
  resolversFactory
617
794
  };
618
795
  };
619
796
  export {
797
+ API_INDEX_BASENAME,
798
+ API_INDEX_PATTERN,
799
+ API_USE_BASENAME,
800
+ API_USE_PATTERN,
801
+ PAGE_INDEX_BASENAME,
802
+ PAGE_INDEX_PATTERN,
803
+ PAGE_LAYOUT_BASENAME,
804
+ PAGE_LAYOUT_PATTERN,
805
+ apiRouteResolverFactory,
806
+ apiUseResolverFactory,
807
+ createRouteEntry,
620
808
  routes_default as default,
621
- resolveRouteEntry,
622
- resolveRouteFile
809
+ isApiRoute,
810
+ isApiUse,
811
+ isPageLayout,
812
+ isPageRoute,
813
+ isRouteFile,
814
+ nestedRoutesFactory,
815
+ pageLayoutResolverFactory,
816
+ pageRouteResolverFactory,
817
+ scanRoutes
623
818
  };
624
819
  //# sourceMappingURL=routes.js.map